[U-Boot] [PATCH v2 1/7] microblaze: Add support for device tree driven board configuration

This is minimum code required to be able to use device-tree for u-boot initialization. Currently only for device driver initialization.
Linker script change ensures DTB to be aligned for both options CONFIG_OF_EMBED and CONFIG_OF_SEPARATE.
Signed-off-by: Michal Simek monstr@monstr.eu CC: Simon Glass sjg@chromium.org
--- v2: Show message about DTB address in bootlog --- arch/microblaze/config.mk | 2 ++ arch/microblaze/cpu/u-boot.lds | 1 + arch/microblaze/include/asm/global_data.h | 1 + arch/microblaze/lib/board.c | 24 ++++++++++++++++++++++++ 4 files changed, 28 insertions(+), 0 deletions(-)
diff --git a/arch/microblaze/config.mk b/arch/microblaze/config.mk index aca79e2..b4935f0 100644 --- a/arch/microblaze/config.mk +++ b/arch/microblaze/config.mk @@ -31,3 +31,5 @@ CONFIG_STANDALONE_LOAD_ADDR ?= 0x80F00000 PLATFORM_CPPFLAGS += -ffixed-r31 -D__microblaze__
LDSCRIPT ?= $(SRCTREE)/$(CPUDIR)/u-boot.lds + +CONFIG_ARCH_DEVICE_TREE := microblaze diff --git a/arch/microblaze/cpu/u-boot.lds b/arch/microblaze/cpu/u-boot.lds index ee41145..d033a28 100644 --- a/arch/microblaze/cpu/u-boot.lds +++ b/arch/microblaze/cpu/u-boot.lds @@ -45,6 +45,7 @@ SECTIONS .data ALIGN(0x4): { __data_start = .; + dts/libdts.o (.data) *(.data) __data_end = .; } diff --git a/arch/microblaze/include/asm/global_data.h b/arch/microblaze/include/asm/global_data.h index 6e8537c..e802e4e 100644 --- a/arch/microblaze/include/asm/global_data.h +++ b/arch/microblaze/include/asm/global_data.h @@ -43,6 +43,7 @@ typedef struct global_data { unsigned long precon_buf_idx; /* Pre-Console buffer index */ #endif unsigned long env_addr; /* Address of Environment struct */ + const void *fdt_blob; /* Our device tree, NULL if none */ unsigned long env_valid; /* Checksum of Environment valid? */ unsigned long fb_base; /* base address of frame buffer */ void **jt; /* jump table */ diff --git a/arch/microblaze/lib/board.c b/arch/microblaze/lib/board.c index b80250a..942e18c 100644 --- a/arch/microblaze/lib/board.c +++ b/arch/microblaze/lib/board.c @@ -34,6 +34,7 @@ #include <net.h> #include <asm/processor.h> #include <asm/microblaze_intc.h> +#include <fdtdec.h>
DECLARE_GLOBAL_DATA_PTR;
@@ -63,6 +64,9 @@ typedef int (init_fnc_t) (void);
init_fnc_t *init_sequence[] = { env_init, +#ifdef CONFIG_OF_CONTROL + fdtdec_check_fdt, +#endif serial_init, console_init_f, #ifdef CONFIG_SYS_GPIO_0 @@ -103,6 +107,17 @@ void board_init (void)
monitor_flash_len = __end - __text_start;
+#ifdef CONFIG_OF_EMBED + /* Get a pointer to the FDT */ + gd->fdt_blob = _binary_dt_dtb_start; +#elif defined CONFIG_OF_SEPARATE + /* FDT is at end of image */ + gd->fdt_blob = (void *)__end; +#endif + /* Allow the early environment to override the fdt address */ + gd->fdt_blob = (void *)getenv_ulong("fdtcontroladdr", 16, + (uintptr_t)gd->fdt_blob); + /* * The Malloc area is immediately below the monitor copy in DRAM * aka CONFIG_SYS_MONITOR_BASE - Note there is no need for reloc_off @@ -121,6 +136,15 @@ void board_init (void) } }
+#ifdef CONFIG_OF_CONTROL + /* For now, put this check after the console is ready */ + if (fdtdec_prepare_fdt()) { + panic("** CONFIG_OF_CONTROL defined but no FDT - please see " + "doc/README.fdt-control"); + } else + printf("DTB: 0x%x\n", (u32)gd->fdt_blob); +#endif + puts ("SDRAM :\n"); printf ("\t\tIcache:%s\n", icache_status() ? "ON" : "OFF"); printf ("\t\tDcache:%s\n", dcache_status() ? "ON" : "OFF");

Variable is used when CONFIG_SYS_FLASH_CHECKSUM is used.
Warning log: board.c: In function 'board_init': board.c:101: warning: unused variable 's'
Signed-off-by: Michal Simek monstr@monstr.eu
--- v2: Use __mabe_unused prefix --- arch/microblaze/lib/board.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-)
diff --git a/arch/microblaze/lib/board.c b/arch/microblaze/lib/board.c index 942e18c..b5f21d8 100644 --- a/arch/microblaze/lib/board.c +++ b/arch/microblaze/lib/board.c @@ -32,6 +32,7 @@ #include <stdio_dev.h> #include <serial.h> #include <net.h> +#include <linux/compiler.h> #include <asm/processor.h> #include <asm/microblaze_intc.h> #include <fdtdec.h> @@ -91,7 +92,7 @@ void board_init (void) gd = (gd_t *) (CONFIG_SYS_SDRAM_BASE + CONFIG_SYS_GBL_DATA_OFFSET); bd = (bd_t *) (CONFIG_SYS_SDRAM_BASE + CONFIG_SYS_GBL_DATA_OFFSET \ - GENERATED_BD_INFO_SIZE); - char *s; + __maybe_unused char *s; #if defined(CONFIG_CMD_FLASH) ulong flash_size = 0; #endif

Am Montag, den 06.08.2012, 09:46 +0200 schrieb Michal Simek:
Variable is used when CONFIG_SYS_FLASH_CHECKSUM is used.
Warning log: board.c: In function 'board_init': board.c:101: warning: unused variable 's'
Signed-off-by: Michal Simek monstr@monstr.eu
Acked-by: Stephan Linz linz@li-pro.net
v2: Use __mabe_unused prefix
arch/microblaze/lib/board.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-)
diff --git a/arch/microblaze/lib/board.c b/arch/microblaze/lib/board.c index 942e18c..b5f21d8 100644 --- a/arch/microblaze/lib/board.c +++ b/arch/microblaze/lib/board.c @@ -32,6 +32,7 @@ #include <stdio_dev.h> #include <serial.h> #include <net.h> +#include <linux/compiler.h> #include <asm/processor.h> #include <asm/microblaze_intc.h> #include <fdtdec.h> @@ -91,7 +92,7 @@ void board_init (void) gd = (gd_t *) (CONFIG_SYS_SDRAM_BASE + CONFIG_SYS_GBL_DATA_OFFSET); bd = (bd_t *) (CONFIG_SYS_SDRAM_BASE + CONFIG_SYS_GBL_DATA_OFFSET \ - GENERATED_BD_INFO_SIZE);
- char *s;
- __maybe_unused char *s;
#if defined(CONFIG_CMD_FLASH) ulong flash_size = 0; #endif

Return value to find out if un/registration was succesful.
Signed-off-by: Michal Simek monstr@monstr.eu
--- v2: Add comment to header file to describe parameters and return codes --- arch/microblaze/cpu/interrupts.c | 16 +++++++++------- arch/microblaze/include/asm/microblaze_intc.h | 11 ++++++++++- 2 files changed, 19 insertions(+), 8 deletions(-)
diff --git a/arch/microblaze/cpu/interrupts.c b/arch/microblaze/cpu/interrupts.c index ee67082..08f6bad 100644 --- a/arch/microblaze/cpu/interrupts.c +++ b/arch/microblaze/cpu/interrupts.c @@ -91,14 +91,13 @@ static void disable_one_interrupt(int irq) #endif }
-/* adding new handler for interrupt */ -void install_interrupt_handler (int irq, interrupt_handler_t * hdlr, void *arg) +int install_interrupt_handler(int irq, interrupt_handler_t *hdlr, void *arg) { struct irq_action *act; /* irq out of range */ if ((irq < 0) || (irq > irq_no)) { puts ("IRQ out of range\n"); - return; + return -1; } act = &vecs[irq]; if (hdlr) { /* enable */ @@ -106,11 +105,14 @@ void install_interrupt_handler (int irq, interrupt_handler_t * hdlr, void *arg) act->arg = arg; act->count = 0; enable_one_interrupt (irq); - } else { /* disable */ - act->handler = (interrupt_handler_t *) def_hdlr; - act->arg = (void *)irq; - disable_one_interrupt (irq); + return 0; } + + /* Disable */ + act->handler = (interrupt_handler_t *) def_hdlr; + act->arg = (void *)irq; + disable_one_interrupt(irq); + return 1; }
/* initialization interrupt controller - hardware */ diff --git a/arch/microblaze/include/asm/microblaze_intc.h b/arch/microblaze/include/asm/microblaze_intc.h index 6142b9c..e9640f5 100644 --- a/arch/microblaze/include/asm/microblaze_intc.h +++ b/arch/microblaze/include/asm/microblaze_intc.h @@ -39,7 +39,16 @@ struct irq_action { int count; /* number of interrupt */ };
-void install_interrupt_handler (int irq, interrupt_handler_t * hdlr, +/** + * Register and unregister interrupt handler rutines + * + * @param irq IRQ number + * @param hdlr Interrupt handler rutine + * @param arg Pointer to argument which is passed to int. handler rutine + * @return 0 if registration pass, 1 if unregistration pass, + * or an error code < 0 otherwise + */ +int install_interrupt_handler(int irq, interrupt_handler_t *hdlr, void *arg);
int interrupts_init(void);

Am Montag, den 06.08.2012, 09:46 +0200 schrieb Michal Simek:
Return value to find out if un/registration was succesful.
Signed-off-by: Michal Simek monstr@monstr.eu
v2: Add comment to header file to describe parameters and return codes
arch/microblaze/cpu/interrupts.c | 16 +++++++++------- arch/microblaze/include/asm/microblaze_intc.h | 11 ++++++++++- 2 files changed, 19 insertions(+), 8 deletions(-)
diff --git a/arch/microblaze/cpu/interrupts.c b/arch/microblaze/cpu/interrupts.c index ee67082..08f6bad 100644 --- a/arch/microblaze/cpu/interrupts.c +++ b/arch/microblaze/cpu/interrupts.c @@ -91,14 +91,13 @@ static void disable_one_interrupt(int irq) #endif }
-/* adding new handler for interrupt */ -void install_interrupt_handler (int irq, interrupt_handler_t * hdlr, void *arg) +int install_interrupt_handler(int irq, interrupt_handler_t *hdlr, void *arg) { struct irq_action *act; /* irq out of range */ if ((irq < 0) || (irq > irq_no)) { puts ("IRQ out of range\n");
return;
} act = &vecs[irq]; if (hdlr) { /* enable */return -1;
@@ -106,11 +105,14 @@ void install_interrupt_handler (int irq, interrupt_handler_t * hdlr, void *arg) act->arg = arg; act->count = 0; enable_one_interrupt (irq);
- } else { /* disable */
act->handler = (interrupt_handler_t *) def_hdlr;
act->arg = (void *)irq;
disable_one_interrupt (irq);
}return 0;
- /* Disable */
- act->handler = (interrupt_handler_t *) def_hdlr;
- act->arg = (void *)irq;
- disable_one_interrupt(irq);
- return 1;
}
/* initialization interrupt controller - hardware */ diff --git a/arch/microblaze/include/asm/microblaze_intc.h b/arch/microblaze/include/asm/microblaze_intc.h index 6142b9c..e9640f5 100644 --- a/arch/microblaze/include/asm/microblaze_intc.h +++ b/arch/microblaze/include/asm/microblaze_intc.h @@ -39,7 +39,16 @@ struct irq_action { int count; /* number of interrupt */ };
-void install_interrupt_handler (int irq, interrupt_handler_t * hdlr, +/**
- Register and unregister interrupt handler rutines
- @param irq IRQ number
- @param hdlr Interrupt handler rutine
- @param arg Pointer to argument which is passed to int. handler rutine
- @return 0 if registration pass, 1 if unregistration pass,
or an error code < 0 otherwise
- */
+int install_interrupt_handler(int irq, interrupt_handler_t *hdlr, void *arg);
Hi Michal,
why not two different functions here, one for registration, another one for unregistration? To mee it is puzzling to use a 'install' function for unregistration ...
... whatever, you should evaluate the return code in fsl_init2() too.
int interrupts_init(void);

On 08/07/2012 10:10 PM, Stephan Linz wrote:
Am Montag, den 06.08.2012, 09:46 +0200 schrieb Michal Simek:
Return value to find out if un/registration was succesful.
Signed-off-by: Michal Simek monstr@monstr.eu
v2: Add comment to header file to describe parameters and return codes
arch/microblaze/cpu/interrupts.c | 16 +++++++++------- arch/microblaze/include/asm/microblaze_intc.h | 11 ++++++++++- 2 files changed, 19 insertions(+), 8 deletions(-)
diff --git a/arch/microblaze/cpu/interrupts.c b/arch/microblaze/cpu/interrupts.c index ee67082..08f6bad 100644 --- a/arch/microblaze/cpu/interrupts.c +++ b/arch/microblaze/cpu/interrupts.c @@ -91,14 +91,13 @@ static void disable_one_interrupt(int irq) #endif }
-/* adding new handler for interrupt */ -void install_interrupt_handler (int irq, interrupt_handler_t * hdlr, void *arg) +int install_interrupt_handler(int irq, interrupt_handler_t *hdlr, void *arg) { struct irq_action *act; /* irq out of range */ if ((irq < 0) || (irq > irq_no)) { puts ("IRQ out of range\n");
return;
} act = &vecs[irq]; if (hdlr) { /* enable */return -1;
@@ -106,11 +105,14 @@ void install_interrupt_handler (int irq, interrupt_handler_t * hdlr, void *arg) act->arg = arg; act->count = 0; enable_one_interrupt (irq);
- } else { /* disable */
act->handler = (interrupt_handler_t *) def_hdlr;
act->arg = (void *)irq;
disable_one_interrupt (irq);
return 0;
}
/* Disable */
act->handler = (interrupt_handler_t *) def_hdlr;
act->arg = (void *)irq;
disable_one_interrupt(irq);
return 1; }
/* initialization interrupt controller - hardware */
diff --git a/arch/microblaze/include/asm/microblaze_intc.h b/arch/microblaze/include/asm/microblaze_intc.h index 6142b9c..e9640f5 100644 --- a/arch/microblaze/include/asm/microblaze_intc.h +++ b/arch/microblaze/include/asm/microblaze_intc.h @@ -39,7 +39,16 @@ struct irq_action { int count; /* number of interrupt */ };
-void install_interrupt_handler (int irq, interrupt_handler_t * hdlr, +/**
- Register and unregister interrupt handler rutines
- @param irq IRQ number
- @param hdlr Interrupt handler rutine
- @param arg Pointer to argument which is passed to int. handler rutine
- @return 0 if registration pass, 1 if unregistration pass,
or an error code < 0 otherwise
- */
+int install_interrupt_handler(int irq, interrupt_handler_t *hdlr, void *arg);
Hi Michal,
why not two different functions here, one for registration, another one for unregistration? To mee it is puzzling to use a 'install' function for unregistration ...
partially agree with that. Maybe we could introduce one macro for that.
#define uninstall_interrupt_handler(irq) install_interrupt_handler(irq, NULL, NULL)
... whatever, you should evaluate the return code in fsl_init2() too.
Not necessary to do it in this patch.
Thanks, Michal

Am Mittwoch, den 08.08.2012, 10:27 +0200 schrieb Michal Simek:
On 08/07/2012 10:10 PM, Stephan Linz wrote:
Am Montag, den 06.08.2012, 09:46 +0200 schrieb Michal Simek:
Return value to find out if un/registration was succesful.
Signed-off-by: Michal Simek monstr@monstr.eu
v2: Add comment to header file to describe parameters and return codes
arch/microblaze/cpu/interrupts.c | 16 +++++++++------- arch/microblaze/include/asm/microblaze_intc.h | 11 ++++++++++- 2 files changed, 19 insertions(+), 8 deletions(-)
diff --git a/arch/microblaze/cpu/interrupts.c b/arch/microblaze/cpu/interrupts.c index ee67082..08f6bad 100644 --- a/arch/microblaze/cpu/interrupts.c +++ b/arch/microblaze/cpu/interrupts.c @@ -91,14 +91,13 @@ static void disable_one_interrupt(int irq) #endif }
-/* adding new handler for interrupt */ -void install_interrupt_handler (int irq, interrupt_handler_t * hdlr, void *arg) +int install_interrupt_handler(int irq, interrupt_handler_t *hdlr, void *arg) { struct irq_action *act; /* irq out of range */ if ((irq < 0) || (irq > irq_no)) { puts ("IRQ out of range\n");
return;
} act = &vecs[irq]; if (hdlr) { /* enable */return -1;
@@ -106,11 +105,14 @@ void install_interrupt_handler (int irq, interrupt_handler_t * hdlr, void *arg) act->arg = arg; act->count = 0; enable_one_interrupt (irq);
- } else { /* disable */
act->handler = (interrupt_handler_t *) def_hdlr;
act->arg = (void *)irq;
disable_one_interrupt (irq);
return 0;
}
/* Disable */
act->handler = (interrupt_handler_t *) def_hdlr;
act->arg = (void *)irq;
disable_one_interrupt(irq);
return 1; }
/* initialization interrupt controller - hardware */
diff --git a/arch/microblaze/include/asm/microblaze_intc.h b/arch/microblaze/include/asm/microblaze_intc.h index 6142b9c..e9640f5 100644 --- a/arch/microblaze/include/asm/microblaze_intc.h +++ b/arch/microblaze/include/asm/microblaze_intc.h @@ -39,7 +39,16 @@ struct irq_action { int count; /* number of interrupt */ };
-void install_interrupt_handler (int irq, interrupt_handler_t * hdlr, +/**
- Register and unregister interrupt handler rutines
- @param irq IRQ number
- @param hdlr Interrupt handler rutine
- @param arg Pointer to argument which is passed to int. handler rutine
- @return 0 if registration pass, 1 if unregistration pass,
or an error code < 0 otherwise
- */
+int install_interrupt_handler(int irq, interrupt_handler_t *hdlr, void *arg);
Hi Michal,
why not two different functions here, one for registration, another one for unregistration? To mee it is puzzling to use a 'install' function for unregistration ...
partially agree with that. Maybe we could introduce one macro for that.
#define uninstall_interrupt_handler(irq) install_interrupt_handler(irq, NULL, NULL)
yes, that is ok ...
... whatever, you should evaluate the return code in fsl_init2() too.
Not necessary to do it in this patch.
yes, it's another part ...
br, Stephan

Just coding style cleanup. Remove unneeded externs.
Signed-off-by: Michal Simek monstr@monstr.eu Acked-by: Simon Glass sjg@chromium.org
-- v2: Rebase - depends on previous intc patch --- arch/microblaze/cpu/interrupts.c | 26 +++++++++++++------------- 1 files changed, 13 insertions(+), 13 deletions(-)
diff --git a/arch/microblaze/cpu/interrupts.c b/arch/microblaze/cpu/interrupts.c index 08f6bad..7f2ee64 100644 --- a/arch/microblaze/cpu/interrupts.c +++ b/arch/microblaze/cpu/interrupts.c @@ -32,15 +32,12 @@
#undef DEBUG_INT
-extern void microblaze_disable_interrupts (void); -extern void microblaze_enable_interrupts (void); - -void enable_interrupts (void) +void enable_interrupts(void) { MSRSET(0x2); }
-int disable_interrupts (void) +int disable_interrupts(void) { unsigned int msr;
@@ -58,20 +55,21 @@ microblaze_intc_t *intc; /* default handler */ static void def_hdlr(void) { - puts ("def_hdlr\n"); + puts("def_hdlr\n"); }
static void enable_one_interrupt(int irq) { int mask; int offset = 1; + offset <<= irq; mask = intc->ier; intc->ier = (mask | offset); #ifdef DEBUG_INT - printf ("Enable one interrupt irq %x - mask %x,ier %x\n", offset, mask, + printf("Enable one interrupt irq %x - mask %x,ier %x\n", offset, mask, intc->ier); - printf ("INTC isr %x, ier %x, iar %x, mer %x\n", intc->isr, intc->ier, + printf("INTC isr %x, ier %x, iar %x, mer %x\n", intc->isr, intc->ier, intc->iar, intc->mer); #endif } @@ -80,13 +78,14 @@ static void disable_one_interrupt(int irq) { int mask; int offset = 1; + offset <<= irq; mask = intc->ier; intc->ier = (mask & ~offset); #ifdef DEBUG_INT - printf ("Disable one interrupt irq %x - mask %x,ier %x\n", irq, mask, + printf("Disable one interrupt irq %x - mask %x,ier %x\n", irq, mask, intc->ier); - printf ("INTC isr %x, ier %x, iar %x, mer %x\n", intc->isr, intc->ier, + printf("INTC isr %x, ier %x, iar %x, mer %x\n", intc->isr, intc->ier, intc->iar, intc->mer); #endif } @@ -94,9 +93,10 @@ static void disable_one_interrupt(int irq) int install_interrupt_handler(int irq, interrupt_handler_t *hdlr, void *arg) { struct irq_action *act; + /* irq out of range */ if ((irq < 0) || (irq > irq_no)) { - puts ("IRQ out of range\n"); + puts("IRQ out of range\n"); return -1; } act = &vecs[irq]; @@ -124,7 +124,7 @@ static void intc_init(void) /* XIntc_Start - hw_interrupt enable and all interrupt enable */ intc->mer = 0x3; #ifdef DEBUG_INT - printf ("INTC isr %x, ier %x, iar %x, mer %x\n", intc->isr, intc->ier, + printf("INTC isr %x, ier %x, iar %x, mer %x\n", intc->isr, intc->ier, intc->iar, intc->mer); #endif } @@ -159,7 +159,7 @@ int interrupts_init(void) return 0; }
-void interrupt_handler (void) +void interrupt_handler(void) { int irqs = intc->ivr; /* find active interrupt */ int mask = 1;

Am Montag, den 06.08.2012, 09:46 +0200 schrieb Michal Simek:
Just coding style cleanup. Remove unneeded externs.
Signed-off-by: Michal Simek monstr@monstr.eu Acked-by: Simon Glass sjg@chromium.org
Acked-by: Stephan Linz linz@li-pro.net
-- v2: Rebase - depends on previous intc patch
arch/microblaze/cpu/interrupts.c | 26 +++++++++++++------------- 1 files changed, 13 insertions(+), 13 deletions(-)
diff --git a/arch/microblaze/cpu/interrupts.c b/arch/microblaze/cpu/interrupts.c index 08f6bad..7f2ee64 100644 --- a/arch/microblaze/cpu/interrupts.c +++ b/arch/microblaze/cpu/interrupts.c @@ -32,15 +32,12 @@
#undef DEBUG_INT
-extern void microblaze_disable_interrupts (void); -extern void microblaze_enable_interrupts (void);
-void enable_interrupts (void) +void enable_interrupts(void) { MSRSET(0x2); }
-int disable_interrupts (void) +int disable_interrupts(void) { unsigned int msr;
@@ -58,20 +55,21 @@ microblaze_intc_t *intc; /* default handler */ static void def_hdlr(void) {
- puts ("def_hdlr\n");
- puts("def_hdlr\n");
}
static void enable_one_interrupt(int irq) { int mask; int offset = 1;
- offset <<= irq; mask = intc->ier; intc->ier = (mask | offset);
#ifdef DEBUG_INT
- printf ("Enable one interrupt irq %x - mask %x,ier %x\n", offset, mask,
- printf("Enable one interrupt irq %x - mask %x,ier %x\n", offset, mask, intc->ier);
- printf ("INTC isr %x, ier %x, iar %x, mer %x\n", intc->isr, intc->ier,
- printf("INTC isr %x, ier %x, iar %x, mer %x\n", intc->isr, intc->ier, intc->iar, intc->mer);
#endif } @@ -80,13 +78,14 @@ static void disable_one_interrupt(int irq) { int mask; int offset = 1;
- offset <<= irq; mask = intc->ier; intc->ier = (mask & ~offset);
#ifdef DEBUG_INT
- printf ("Disable one interrupt irq %x - mask %x,ier %x\n", irq, mask,
- printf("Disable one interrupt irq %x - mask %x,ier %x\n", irq, mask, intc->ier);
- printf ("INTC isr %x, ier %x, iar %x, mer %x\n", intc->isr, intc->ier,
- printf("INTC isr %x, ier %x, iar %x, mer %x\n", intc->isr, intc->ier, intc->iar, intc->mer);
#endif } @@ -94,9 +93,10 @@ static void disable_one_interrupt(int irq) int install_interrupt_handler(int irq, interrupt_handler_t *hdlr, void *arg) { struct irq_action *act;
- /* irq out of range */ if ((irq < 0) || (irq > irq_no)) {
puts ("IRQ out of range\n");
return -1; } act = &vecs[irq];puts("IRQ out of range\n");
@@ -124,7 +124,7 @@ static void intc_init(void) /* XIntc_Start - hw_interrupt enable and all interrupt enable */ intc->mer = 0x3; #ifdef DEBUG_INT
- printf ("INTC isr %x, ier %x, iar %x, mer %x\n", intc->isr, intc->ier,
- printf("INTC isr %x, ier %x, iar %x, mer %x\n", intc->isr, intc->ier, intc->iar, intc->mer);
#endif } @@ -159,7 +159,7 @@ int interrupts_init(void) return 0; }
-void interrupt_handler (void) +void interrupt_handler(void) { int irqs = intc->ivr; /* find active interrupt */ int mask = 1;

microblaze: Fix CONFIG_SYS_HZ usage in board config
Do not use hardcoded value. Use CONFIG_SYS_HZ instead. Separate static configuration to single block.
Signed-off-by: Michal Simek monstr@monstr.eu
--- v2: Fix irq type irq == -1 means no IRQ --- arch/microblaze/cpu/timer.c | 69 ++++++++++++----------- arch/microblaze/include/asm/microblaze_timer.h | 3 + arch/microblaze/lib/board.c | 5 -- include/configs/microblaze-generic.h | 12 +---- 4 files changed, 41 insertions(+), 48 deletions(-)
diff --git a/arch/microblaze/cpu/timer.c b/arch/microblaze/cpu/timer.c index cc6b897..1330401 100644 --- a/arch/microblaze/cpu/timer.c +++ b/arch/microblaze/cpu/timer.c @@ -27,42 +27,30 @@ #include <asm/microblaze_intc.h>
volatile int timestamp = 0; +microblaze_timer_t *tmr;
-#ifdef CONFIG_SYS_TIMER_0 ulong get_timer (ulong base) { - return (timestamp - base); + if (tmr) + return timestamp - base; + return timestamp++ - base; } -#else -ulong get_timer (ulong base) -{ - return (timestamp++ - base); -} -#endif
-#ifdef CONFIG_SYS_TIMER_0 void __udelay(unsigned long usec) { - int i; + u32 i;
- i = get_timer(0); - while ((get_timer(0) - i) < (usec / 1000)) - ; + if (tmr) { + i = get_timer(0); + while ((get_timer(0) - i) < (usec / 1000)) + ; + } else { + for (i = 0; i < (usec * XILINX_CLOCK_FREQ / 10000000); i++) + ; + } } -#else -void __udelay(unsigned long usec) -{ - unsigned int i;
- for (i = 0; i < (usec * CONFIG_XILINX_CLOCK_FREQ / 10000000); i++) - ; -} -#endif - -#ifdef CONFIG_SYS_TIMER_0 -microblaze_timer_t *tmr = (microblaze_timer_t *) (CONFIG_SYS_TIMER_0_ADDR); - -void timer_isr (void *arg) +static void timer_isr(void *arg) { timestamp++; tmr->control = tmr->control | TIMER_INTERRUPT; @@ -70,15 +58,30 @@ void timer_isr (void *arg)
int timer_init (void) { - tmr->loadreg = CONFIG_SYS_TIMER_0_PRELOAD; - tmr->control = TIMER_INTERRUPT | TIMER_RESET; - tmr->control = - TIMER_ENABLE | TIMER_ENABLE_INTR | TIMER_RELOAD | TIMER_DOWN_COUNT; - timestamp = 0; - install_interrupt_handler (CONFIG_SYS_TIMER_0_IRQ, timer_isr, (void *)tmr); + int irq = -1; + u32 preload = 0; + u32 ret = 0; + +#if defined(CONFIG_SYS_TIMER_0_ADDR) && defined(CONFIG_SYS_INTC_0_NUM) + preload = XILINX_CLOCK_FREQ / CONFIG_SYS_HZ; + irq = CONFIG_SYS_TIMER_0_IRQ; + tmr = (microblaze_timer_t *) (CONFIG_SYS_TIMER_0_ADDR); +#endif + + if (tmr && preload && irq >= 0) { + tmr->loadreg = preload; + tmr->control = TIMER_INTERRUPT | TIMER_RESET; + tmr->control = TIMER_ENABLE | TIMER_ENABLE_INTR |\ + TIMER_RELOAD | TIMER_DOWN_COUNT; + timestamp = 0; + ret = install_interrupt_handler (irq, timer_isr, (void *)tmr); + if (ret) + tmr = NULL; + } + + /* No problem if timer is not found/initialized */ return 0; } -#endif
/* * This function is derived from PowerPC code (read timebase as long long). diff --git a/arch/microblaze/include/asm/microblaze_timer.h b/arch/microblaze/include/asm/microblaze_timer.h index 844c8db..28e8b02 100644 --- a/arch/microblaze/include/asm/microblaze_timer.h +++ b/arch/microblaze/include/asm/microblaze_timer.h @@ -39,3 +39,6 @@ typedef volatile struct microblaze_timer_t { int loadreg; /* load register TLR */ int counter; /* timer/counter register */ } microblaze_timer_t; + +int timer_init(void); + diff --git a/arch/microblaze/lib/board.c b/arch/microblaze/lib/board.c index b5f21d8..fde109f 100644 --- a/arch/microblaze/lib/board.c +++ b/arch/microblaze/lib/board.c @@ -42,9 +42,6 @@ DECLARE_GLOBAL_DATA_PTR; #ifdef CONFIG_SYS_GPIO_0 extern int gpio_init (void); #endif -#ifdef CONFIG_SYS_TIMER_0 -extern int timer_init (void); -#endif #ifdef CONFIG_SYS_FSL_2 extern void fsl_init2 (void); #endif @@ -74,9 +71,7 @@ init_fnc_t *init_sequence[] = { gpio_init, #endif interrupts_init, -#ifdef CONFIG_SYS_TIMER_0 timer_init, -#endif #ifdef CONFIG_SYS_FSL_2 fsl_init2, #endif diff --git a/include/configs/microblaze-generic.h b/include/configs/microblaze-generic.h index 1266cf7..21ddb2b 100644 --- a/include/configs/microblaze-generic.h +++ b/include/configs/microblaze-generic.h @@ -115,19 +115,11 @@ #endif
/* timer */ -#ifdef XILINX_TIMER_BASEADDR -# if (XILINX_TIMER_IRQ != -1) -# define CONFIG_SYS_TIMER_0 1 +#if defined(XILINX_TIMER_BASEADD) && defined(XILINX_TIMER_IRQ) # define CONFIG_SYS_TIMER_0_ADDR XILINX_TIMER_BASEADDR # define CONFIG_SYS_TIMER_0_IRQ XILINX_TIMER_IRQ -# define FREQUENCE XILINX_CLOCK_FREQ -# define CONFIG_SYS_TIMER_0_PRELOAD ( FREQUENCE/1000 ) -# endif -#elif XILINX_CLOCK_FREQ -# define CONFIG_XILINX_CLOCK_FREQ XILINX_CLOCK_FREQ -#else -# error BAD CLOCK FREQ #endif + /* FSL */ /* #define CONFIG_SYS_FSL_2 */ /* #define FSL_INTR_2 1 */

Hi Michal,
looks fine, but ... (see below)
Am Montag, den 06.08.2012, 09:46 +0200 schrieb Michal Simek:
microblaze: Fix CONFIG_SYS_HZ usage in board config
Do not use hardcoded value. Use CONFIG_SYS_HZ instead. Separate static configuration to single block.
Signed-off-by: Michal Simek monstr@monstr.eu
v2: Fix irq type irq == -1 means no IRQ
arch/microblaze/cpu/timer.c | 69 ++++++++++++----------- arch/microblaze/include/asm/microblaze_timer.h | 3 + arch/microblaze/lib/board.c | 5 -- include/configs/microblaze-generic.h | 12 +---- 4 files changed, 41 insertions(+), 48 deletions(-)
diff --git a/arch/microblaze/cpu/timer.c b/arch/microblaze/cpu/timer.c index cc6b897..1330401 100644 --- a/arch/microblaze/cpu/timer.c +++ b/arch/microblaze/cpu/timer.c @@ -27,42 +27,30 @@ #include <asm/microblaze_intc.h>
volatile int timestamp = 0; +microblaze_timer_t *tmr;
-#ifdef CONFIG_SYS_TIMER_0 ulong get_timer (ulong base) {
- return (timestamp - base);
- if (tmr)
return timestamp - base;
- return timestamp++ - base;
} -#else -ulong get_timer (ulong base) -{
- return (timestamp++ - base);
-} -#endif
-#ifdef CONFIG_SYS_TIMER_0 void __udelay(unsigned long usec) {
- int i;
- u32 i;
- i = get_timer(0);
- while ((get_timer(0) - i) < (usec / 1000))
;
- if (tmr) {
i = get_timer(0);
while ((get_timer(0) - i) < (usec / 1000))
;
- } else {
for (i = 0; i < (usec * XILINX_CLOCK_FREQ / 10000000); i++)
;
- }
} -#else -void __udelay(unsigned long usec) -{
unsigned int i;
for (i = 0; i < (usec * CONFIG_XILINX_CLOCK_FREQ / 10000000); i++)
;
-} -#endif
-#ifdef CONFIG_SYS_TIMER_0 -microblaze_timer_t *tmr = (microblaze_timer_t *) (CONFIG_SYS_TIMER_0_ADDR);
-void timer_isr (void *arg) +static void timer_isr(void *arg) { timestamp++; tmr->control = tmr->control | TIMER_INTERRUPT; @@ -70,15 +58,30 @@ void timer_isr (void *arg)
int timer_init (void) {
- tmr->loadreg = CONFIG_SYS_TIMER_0_PRELOAD;
- tmr->control = TIMER_INTERRUPT | TIMER_RESET;
- tmr->control =
TIMER_ENABLE | TIMER_ENABLE_INTR | TIMER_RELOAD | TIMER_DOWN_COUNT;
- timestamp = 0;
- install_interrupt_handler (CONFIG_SYS_TIMER_0_IRQ, timer_isr, (void *)tmr);
- int irq = -1;
- u32 preload = 0;
- u32 ret = 0;
+#if defined(CONFIG_SYS_TIMER_0_ADDR) && defined(CONFIG_SYS_INTC_0_NUM)
- preload = XILINX_CLOCK_FREQ / CONFIG_SYS_HZ;
- irq = CONFIG_SYS_TIMER_0_IRQ;
- tmr = (microblaze_timer_t *) (CONFIG_SYS_TIMER_0_ADDR);
+#endif
- if (tmr && preload && irq >= 0) {
tmr->loadreg = preload;
tmr->control = TIMER_INTERRUPT | TIMER_RESET;
tmr->control = TIMER_ENABLE | TIMER_ENABLE_INTR |\
TIMER_RELOAD | TIMER_DOWN_COUNT;
timestamp = 0;
ret = install_interrupt_handler (irq, timer_isr, (void *)tmr);
if (ret)
tmr = NULL;
- }
- /* No problem if timer is not found/initialized */ return 0;
} -#endif
/*
- This function is derived from PowerPC code (read timebase as long long).
diff --git a/arch/microblaze/include/asm/microblaze_timer.h b/arch/microblaze/include/asm/microblaze_timer.h index 844c8db..28e8b02 100644 --- a/arch/microblaze/include/asm/microblaze_timer.h +++ b/arch/microblaze/include/asm/microblaze_timer.h @@ -39,3 +39,6 @@ typedef volatile struct microblaze_timer_t { int loadreg; /* load register TLR */ int counter; /* timer/counter register */ } microblaze_timer_t;
+int timer_init(void);
diff --git a/arch/microblaze/lib/board.c b/arch/microblaze/lib/board.c index b5f21d8..fde109f 100644 --- a/arch/microblaze/lib/board.c +++ b/arch/microblaze/lib/board.c @@ -42,9 +42,6 @@ DECLARE_GLOBAL_DATA_PTR; #ifdef CONFIG_SYS_GPIO_0 extern int gpio_init (void); #endif -#ifdef CONFIG_SYS_TIMER_0 -extern int timer_init (void); -#endif #ifdef CONFIG_SYS_FSL_2 extern void fsl_init2 (void); #endif @@ -74,9 +71,7 @@ init_fnc_t *init_sequence[] = { gpio_init, #endif interrupts_init, -#ifdef CONFIG_SYS_TIMER_0 timer_init, -#endif #ifdef CONFIG_SYS_FSL_2 fsl_init2, #endif diff --git a/include/configs/microblaze-generic.h b/include/configs/microblaze-generic.h index 1266cf7..21ddb2b 100644 --- a/include/configs/microblaze-generic.h +++ b/include/configs/microblaze-generic.h @@ -115,19 +115,11 @@ #endif
/* timer */ -#ifdef XILINX_TIMER_BASEADDR -# if (XILINX_TIMER_IRQ != -1) -# define CONFIG_SYS_TIMER_0 1 +#if defined(XILINX_TIMER_BASEADD) && defined(XILINX_TIMER_IRQ)
typo here XILINX_TIMER_BASEADD <--- missing 'R'
br, Stephan
# define CONFIG_SYS_TIMER_0_ADDR XILINX_TIMER_BASEADDR # define CONFIG_SYS_TIMER_0_IRQ XILINX_TIMER_IRQ -# define FREQUENCE XILINX_CLOCK_FREQ -# define CONFIG_SYS_TIMER_0_PRELOAD ( FREQUENCE/1000 ) -# endif -#elif XILINX_CLOCK_FREQ -# define CONFIG_XILINX_CLOCK_FREQ XILINX_CLOCK_FREQ -#else -# error BAD CLOCK FREQ #endif
/* FSL */ /* #define CONFIG_SYS_FSL_2 */ /* #define FSL_INTR_2 1 */

On 08/07/2012 10:10 PM, Stephan Linz wrote:
Hi Michal,
looks fine, but ... (see below)
Am Montag, den 06.08.2012, 09:46 +0200 schrieb Michal Simek:
microblaze: Fix CONFIG_SYS_HZ usage in board config
Do not use hardcoded value. Use CONFIG_SYS_HZ instead. Separate static configuration to single block.
Signed-off-by: Michal Simek monstr@monstr.eu
v2: Fix irq type irq == -1 means no IRQ
arch/microblaze/cpu/timer.c | 69 ++++++++++++----------- arch/microblaze/include/asm/microblaze_timer.h | 3 + arch/microblaze/lib/board.c | 5 -- include/configs/microblaze-generic.h | 12 +---- 4 files changed, 41 insertions(+), 48 deletions(-)
diff --git a/arch/microblaze/cpu/timer.c b/arch/microblaze/cpu/timer.c index cc6b897..1330401 100644 --- a/arch/microblaze/cpu/timer.c +++ b/arch/microblaze/cpu/timer.c @@ -27,42 +27,30 @@ #include <asm/microblaze_intc.h>
volatile int timestamp = 0; +microblaze_timer_t *tmr;
-#ifdef CONFIG_SYS_TIMER_0 ulong get_timer (ulong base) {
- return (timestamp - base);
- if (tmr)
return timestamp - base;
- return timestamp++ - base; }
-#else -ulong get_timer (ulong base) -{
- return (timestamp++ - base);
-} -#endif
-#ifdef CONFIG_SYS_TIMER_0 void __udelay(unsigned long usec) {
- int i;
- u32 i;
- i = get_timer(0);
- while ((get_timer(0) - i) < (usec / 1000))
;
- if (tmr) {
i = get_timer(0);
while ((get_timer(0) - i) < (usec / 1000))
;
- } else {
for (i = 0; i < (usec * XILINX_CLOCK_FREQ / 10000000); i++)
;
- } }
-#else -void __udelay(unsigned long usec) -{
unsigned int i;
for (i = 0; i < (usec * CONFIG_XILINX_CLOCK_FREQ / 10000000); i++)
;
-} -#endif
-#ifdef CONFIG_SYS_TIMER_0 -microblaze_timer_t *tmr = (microblaze_timer_t *) (CONFIG_SYS_TIMER_0_ADDR);
-void timer_isr (void *arg) +static void timer_isr(void *arg) { timestamp++; tmr->control = tmr->control | TIMER_INTERRUPT; @@ -70,15 +58,30 @@ void timer_isr (void *arg)
int timer_init (void) {
- tmr->loadreg = CONFIG_SYS_TIMER_0_PRELOAD;
- tmr->control = TIMER_INTERRUPT | TIMER_RESET;
- tmr->control =
TIMER_ENABLE | TIMER_ENABLE_INTR | TIMER_RELOAD | TIMER_DOWN_COUNT;
- timestamp = 0;
- install_interrupt_handler (CONFIG_SYS_TIMER_0_IRQ, timer_isr, (void *)tmr);
- int irq = -1;
- u32 preload = 0;
- u32 ret = 0;
+#if defined(CONFIG_SYS_TIMER_0_ADDR) && defined(CONFIG_SYS_INTC_0_NUM)
- preload = XILINX_CLOCK_FREQ / CONFIG_SYS_HZ;
- irq = CONFIG_SYS_TIMER_0_IRQ;
- tmr = (microblaze_timer_t *) (CONFIG_SYS_TIMER_0_ADDR);
+#endif
- if (tmr && preload && irq >= 0) {
tmr->loadreg = preload;
tmr->control = TIMER_INTERRUPT | TIMER_RESET;
tmr->control = TIMER_ENABLE | TIMER_ENABLE_INTR |\
TIMER_RELOAD | TIMER_DOWN_COUNT;
timestamp = 0;
ret = install_interrupt_handler (irq, timer_isr, (void *)tmr);
if (ret)
tmr = NULL;
- }
- /* No problem if timer is not found/initialized */ return 0; }
-#endif
/*
- This function is derived from PowerPC code (read timebase as long long).
diff --git a/arch/microblaze/include/asm/microblaze_timer.h b/arch/microblaze/include/asm/microblaze_timer.h index 844c8db..28e8b02 100644 --- a/arch/microblaze/include/asm/microblaze_timer.h +++ b/arch/microblaze/include/asm/microblaze_timer.h @@ -39,3 +39,6 @@ typedef volatile struct microblaze_timer_t { int loadreg; /* load register TLR */ int counter; /* timer/counter register */ } microblaze_timer_t;
+int timer_init(void);
diff --git a/arch/microblaze/lib/board.c b/arch/microblaze/lib/board.c index b5f21d8..fde109f 100644 --- a/arch/microblaze/lib/board.c +++ b/arch/microblaze/lib/board.c @@ -42,9 +42,6 @@ DECLARE_GLOBAL_DATA_PTR; #ifdef CONFIG_SYS_GPIO_0 extern int gpio_init (void); #endif -#ifdef CONFIG_SYS_TIMER_0 -extern int timer_init (void); -#endif #ifdef CONFIG_SYS_FSL_2 extern void fsl_init2 (void); #endif @@ -74,9 +71,7 @@ init_fnc_t *init_sequence[] = { gpio_init, #endif interrupts_init, -#ifdef CONFIG_SYS_TIMER_0 timer_init, -#endif #ifdef CONFIG_SYS_FSL_2 fsl_init2, #endif diff --git a/include/configs/microblaze-generic.h b/include/configs/microblaze-generic.h index 1266cf7..21ddb2b 100644 --- a/include/configs/microblaze-generic.h +++ b/include/configs/microblaze-generic.h @@ -115,19 +115,11 @@ #endif
/* timer */ -#ifdef XILINX_TIMER_BASEADDR -# if (XILINX_TIMER_IRQ != -1) -# define CONFIG_SYS_TIMER_0 1 +#if defined(XILINX_TIMER_BASEADD) && defined(XILINX_TIMER_IRQ)
typo here XILINX_TIMER_BASEADD <--- missing 'R'
Will fix it when I add this to my branch.
Thanks, Michal

Move board specific function to board_init function in board/ folder Remove externs from generic board.c Use board_init_f function in board.c file.
Signed-off-by: Michal Simek monstr@monstr.eu
--- v2: Remove global pointer Define board_init function in header --- arch/microblaze/cpu/start.S | 2 +- arch/microblaze/include/asm/processor.h | 3 +++ arch/microblaze/lib/board.c | 17 +++-------------- .../xilinx/microblaze-generic/microblaze-generic.c | 9 +++++++++ 4 files changed, 16 insertions(+), 15 deletions(-)
diff --git a/arch/microblaze/cpu/start.S b/arch/microblaze/cpu/start.S index 8a2f634..8564c4e 100644 --- a/arch/microblaze/cpu/start.S +++ b/arch/microblaze/cpu/start.S @@ -149,7 +149,7 @@ clear_bss: cmp r6, r5, r4 /* check if we have reach the end */ bnei r6, 2b 3: /* jumping to board_init */ - brai board_init + brai board_init_f 1: bri 1b
/* diff --git a/arch/microblaze/include/asm/processor.h b/arch/microblaze/include/asm/processor.h index 2295d0a..2c4d5ff 100644 --- a/arch/microblaze/include/asm/processor.h +++ b/arch/microblaze/include/asm/processor.h @@ -28,4 +28,7 @@ extern char __end[]; extern char __text_start[];
+/* Microblaze board initialization function */ +void board_init(void); + #endif /* __ASM_MICROBLAZE_PROCESSOR_H */ diff --git a/arch/microblaze/lib/board.c b/arch/microblaze/lib/board.c index fde109f..b450367 100644 --- a/arch/microblaze/lib/board.c +++ b/arch/microblaze/lib/board.c @@ -39,13 +39,6 @@
DECLARE_GLOBAL_DATA_PTR;
-#ifdef CONFIG_SYS_GPIO_0 -extern int gpio_init (void); -#endif -#ifdef CONFIG_SYS_FSL_2 -extern void fsl_init2 (void); -#endif - /* * All attempts to come up with a "common" initialization sequence * that works for all boards and architectures failed: some of the @@ -67,20 +60,14 @@ init_fnc_t *init_sequence[] = { #endif serial_init, console_init_f, -#ifdef CONFIG_SYS_GPIO_0 - gpio_init, -#endif interrupts_init, timer_init, -#ifdef CONFIG_SYS_FSL_2 - fsl_init2, -#endif NULL, };
unsigned long monitor_flash_len;
-void board_init (void) +void board_init_f(ulong not_used) { bd_t *bd; init_fnc_t **init_fnc_ptr; @@ -189,6 +176,8 @@ void board_init (void) /* Initialize the console (after the relocation and devices init) */ console_init_r();
+ board_init(); + /* Initialize from environment */ load_addr = getenv_ulong("loadaddr", 16, load_addr);
diff --git a/board/xilinx/microblaze-generic/microblaze-generic.c b/board/xilinx/microblaze-generic/microblaze-generic.c index a1e2bfe..b75e62c 100644 --- a/board/xilinx/microblaze-generic/microblaze-generic.c +++ b/board/xilinx/microblaze-generic/microblaze-generic.c @@ -28,6 +28,7 @@ #include <common.h> #include <config.h> #include <netdev.h> +#include <asm/processor.h> #include <asm/microblaze_intc.h> #include <asm/asm.h>
@@ -69,6 +70,14 @@ int fsl_init2 (void) { } #endif
+void board_init(void) +{ + gpio_init(); +#ifdef CONFIG_SYS_FSL_2 + fsl_init2(); +#endif +} + int board_eth_init(bd_t *bis) { int ret = 0;

Am Montag, den 06.08.2012, 09:46 +0200 schrieb Michal Simek:
Move board specific function to board_init function in board/ folder Remove externs from generic board.c Use board_init_f function in board.c file.
Signed-off-by: Michal Simek monstr@monstr.eu
Acked-by: Stephan Linz linz@li-pro.net
Tested with AXI systems on Avnet S6LX150T and S6LX9 micro-evaluation.
v2: Remove global pointer Define board_init function in header
arch/microblaze/cpu/start.S | 2 +- arch/microblaze/include/asm/processor.h | 3 +++ arch/microblaze/lib/board.c | 17 +++-------------- .../xilinx/microblaze-generic/microblaze-generic.c | 9 +++++++++ 4 files changed, 16 insertions(+), 15 deletions(-)
diff --git a/arch/microblaze/cpu/start.S b/arch/microblaze/cpu/start.S index 8a2f634..8564c4e 100644 --- a/arch/microblaze/cpu/start.S +++ b/arch/microblaze/cpu/start.S @@ -149,7 +149,7 @@ clear_bss: cmp r6, r5, r4 /* check if we have reach the end */ bnei r6, 2b 3: /* jumping to board_init */
- brai board_init
- brai board_init_f
1: bri 1b
/* diff --git a/arch/microblaze/include/asm/processor.h b/arch/microblaze/include/asm/processor.h index 2295d0a..2c4d5ff 100644 --- a/arch/microblaze/include/asm/processor.h +++ b/arch/microblaze/include/asm/processor.h @@ -28,4 +28,7 @@ extern char __end[]; extern char __text_start[];
+/* Microblaze board initialization function */ +void board_init(void);
#endif /* __ASM_MICROBLAZE_PROCESSOR_H */ diff --git a/arch/microblaze/lib/board.c b/arch/microblaze/lib/board.c index fde109f..b450367 100644 --- a/arch/microblaze/lib/board.c +++ b/arch/microblaze/lib/board.c @@ -39,13 +39,6 @@
DECLARE_GLOBAL_DATA_PTR;
-#ifdef CONFIG_SYS_GPIO_0 -extern int gpio_init (void); -#endif -#ifdef CONFIG_SYS_FSL_2 -extern void fsl_init2 (void); -#endif
/*
- All attempts to come up with a "common" initialization sequence
- that works for all boards and architectures failed: some of the
@@ -67,20 +60,14 @@ init_fnc_t *init_sequence[] = { #endif serial_init, console_init_f, -#ifdef CONFIG_SYS_GPIO_0
- gpio_init,
-#endif interrupts_init, timer_init, -#ifdef CONFIG_SYS_FSL_2
- fsl_init2,
-#endif NULL, };
unsigned long monitor_flash_len;
-void board_init (void) +void board_init_f(ulong not_used) { bd_t *bd; init_fnc_t **init_fnc_ptr; @@ -189,6 +176,8 @@ void board_init (void) /* Initialize the console (after the relocation and devices init) */ console_init_r();
- board_init();
- /* Initialize from environment */ load_addr = getenv_ulong("loadaddr", 16, load_addr);
diff --git a/board/xilinx/microblaze-generic/microblaze-generic.c b/board/xilinx/microblaze-generic/microblaze-generic.c index a1e2bfe..b75e62c 100644 --- a/board/xilinx/microblaze-generic/microblaze-generic.c +++ b/board/xilinx/microblaze-generic/microblaze-generic.c @@ -28,6 +28,7 @@ #include <common.h> #include <config.h> #include <netdev.h> +#include <asm/processor.h> #include <asm/microblaze_intc.h> #include <asm/asm.h>
@@ -69,6 +70,14 @@ int fsl_init2 (void) { } #endif
+void board_init(void) +{
- gpio_init();
+#ifdef CONFIG_SYS_FSL_2
- fsl_init2();
+#endif +}
int board_eth_init(bd_t *bis) { int ret = 0;

Prepare for device-tree driven configuration.
Signed-off-by: Michal Simek monstr@monstr.eu
--- v2: Move bi_flashsize and bi_flashoffset from other patch --- arch/microblaze/lib/board.c | 10 ++++++---- 1 files changed, 6 insertions(+), 4 deletions(-)
diff --git a/arch/microblaze/lib/board.c b/arch/microblaze/lib/board.c index b450367..674b573 100644 --- a/arch/microblaze/lib/board.c +++ b/arch/microblaze/lib/board.c @@ -136,9 +136,8 @@ void board_init_f(ulong not_used) #if defined(CONFIG_CMD_FLASH) puts ("Flash: "); bd->bi_flashstart = CONFIG_SYS_FLASH_BASE; - if (0 < (flash_size = flash_init ())) { - bd->bi_flashsize = flash_size; - bd->bi_flashoffset = CONFIG_SYS_FLASH_BASE + flash_size; + flash_size = flash_init(); + if (bd->bi_flashstart && flash_size > 0) { # ifdef CONFIG_SYS_FLASH_CHECKSUM print_size (flash_size, ""); /* @@ -149,13 +148,16 @@ void board_init_f(ulong not_used) s = getenv ("flashchecksum"); if (s && (*s == 'y')) { printf (" CRC: %08X", - crc32 (0, (const unsigned char *) CONFIG_SYS_FLASH_BASE, flash_size) + crc32(0, (const u8 *)bd->bi_flashstart, + flash_size) ); } putc ('\n'); # else /* !CONFIG_SYS_FLASH_CHECKSUM */ print_size (flash_size, "\n"); # endif /* CONFIG_SYS_FLASH_CHECKSUM */ + bd->bi_flashsize = flash_size; + bd->bi_flashoffset = bd->bi_flashstart + flash_size; } else { puts ("Flash init FAILED"); bd->bi_flashstart = 0;

Am Montag, den 06.08.2012, 09:46 +0200 schrieb Michal Simek:
Prepare for device-tree driven configuration.
Signed-off-by: Michal Simek monstr@monstr.eu
Acked-by: Stephan Linz linz@li-pro.net
Tested with AXI systems on Avnet S6LX150T and S6LX9 micro-evaluation.
v2: Move bi_flashsize and bi_flashoffset from other patch
arch/microblaze/lib/board.c | 10 ++++++---- 1 files changed, 6 insertions(+), 4 deletions(-)
diff --git a/arch/microblaze/lib/board.c b/arch/microblaze/lib/board.c index b450367..674b573 100644 --- a/arch/microblaze/lib/board.c +++ b/arch/microblaze/lib/board.c @@ -136,9 +136,8 @@ void board_init_f(ulong not_used) #if defined(CONFIG_CMD_FLASH) puts ("Flash: "); bd->bi_flashstart = CONFIG_SYS_FLASH_BASE;
- if (0 < (flash_size = flash_init ())) {
bd->bi_flashsize = flash_size;
bd->bi_flashoffset = CONFIG_SYS_FLASH_BASE + flash_size;
- flash_size = flash_init();
- if (bd->bi_flashstart && flash_size > 0) {
# ifdef CONFIG_SYS_FLASH_CHECKSUM print_size (flash_size, ""); /* @@ -149,13 +148,16 @@ void board_init_f(ulong not_used) s = getenv ("flashchecksum"); if (s && (*s == 'y')) { printf (" CRC: %08X",
crc32 (0, (const unsigned char *) CONFIG_SYS_FLASH_BASE, flash_size)
crc32(0, (const u8 *)bd->bi_flashstart,
} putc ('\n');flash_size) );
# else /* !CONFIG_SYS_FLASH_CHECKSUM */ print_size (flash_size, "\n"); # endif /* CONFIG_SYS_FLASH_CHECKSUM */
bd->bi_flashsize = flash_size;
} else { puts ("Flash init FAILED"); bd->bi_flashstart = 0;bd->bi_flashoffset = bd->bi_flashstart + flash_size;

Am Montag, den 06.08.2012, 09:46 +0200 schrieb Michal Simek:
This is minimum code required to be able to use device-tree for u-boot initialization. Currently only for device driver initialization.
Linker script change ensures DTB to be aligned for both options CONFIG_OF_EMBED and CONFIG_OF_SEPARATE.
Signed-off-by: Michal Simek monstr@monstr.eu CC: Simon Glass sjg@chromium.org
Acked-by: Stephan Linz linz@li-pro.net
Tested with AXI systems on Avnet S6LX150T and S6LX9 micro-evaluation.
v2: Show message about DTB address in bootlog
arch/microblaze/config.mk | 2 ++ arch/microblaze/cpu/u-boot.lds | 1 + arch/microblaze/include/asm/global_data.h | 1 + arch/microblaze/lib/board.c | 24 ++++++++++++++++++++++++ 4 files changed, 28 insertions(+), 0 deletions(-)
diff --git a/arch/microblaze/config.mk b/arch/microblaze/config.mk index aca79e2..b4935f0 100644 --- a/arch/microblaze/config.mk +++ b/arch/microblaze/config.mk @@ -31,3 +31,5 @@ CONFIG_STANDALONE_LOAD_ADDR ?= 0x80F00000 PLATFORM_CPPFLAGS += -ffixed-r31 -D__microblaze__
LDSCRIPT ?= $(SRCTREE)/$(CPUDIR)/u-boot.lds
+CONFIG_ARCH_DEVICE_TREE := microblaze diff --git a/arch/microblaze/cpu/u-boot.lds b/arch/microblaze/cpu/u-boot.lds index ee41145..d033a28 100644 --- a/arch/microblaze/cpu/u-boot.lds +++ b/arch/microblaze/cpu/u-boot.lds @@ -45,6 +45,7 @@ SECTIONS .data ALIGN(0x4): { __data_start = .;
*(.data) __data_end = .; }dts/libdts.o (.data)
diff --git a/arch/microblaze/include/asm/global_data.h b/arch/microblaze/include/asm/global_data.h index 6e8537c..e802e4e 100644 --- a/arch/microblaze/include/asm/global_data.h +++ b/arch/microblaze/include/asm/global_data.h @@ -43,6 +43,7 @@ typedef struct global_data { unsigned long precon_buf_idx; /* Pre-Console buffer index */ #endif unsigned long env_addr; /* Address of Environment struct */
- const void *fdt_blob; /* Our device tree, NULL if none */ unsigned long env_valid; /* Checksum of Environment valid? */ unsigned long fb_base; /* base address of frame buffer */ void **jt; /* jump table */
diff --git a/arch/microblaze/lib/board.c b/arch/microblaze/lib/board.c index b80250a..942e18c 100644 --- a/arch/microblaze/lib/board.c +++ b/arch/microblaze/lib/board.c @@ -34,6 +34,7 @@ #include <net.h> #include <asm/processor.h> #include <asm/microblaze_intc.h> +#include <fdtdec.h>
DECLARE_GLOBAL_DATA_PTR;
@@ -63,6 +64,9 @@ typedef int (init_fnc_t) (void);
init_fnc_t *init_sequence[] = { env_init, +#ifdef CONFIG_OF_CONTROL
- fdtdec_check_fdt,
+#endif serial_init, console_init_f, #ifdef CONFIG_SYS_GPIO_0 @@ -103,6 +107,17 @@ void board_init (void)
monitor_flash_len = __end - __text_start;
+#ifdef CONFIG_OF_EMBED
- /* Get a pointer to the FDT */
- gd->fdt_blob = _binary_dt_dtb_start;
+#elif defined CONFIG_OF_SEPARATE
- /* FDT is at end of image */
- gd->fdt_blob = (void *)__end;
+#endif
- /* Allow the early environment to override the fdt address */
- gd->fdt_blob = (void *)getenv_ulong("fdtcontroladdr", 16,
(uintptr_t)gd->fdt_blob);
- /*
- The Malloc area is immediately below the monitor copy in DRAM
- aka CONFIG_SYS_MONITOR_BASE - Note there is no need for reloc_off
@@ -121,6 +136,15 @@ void board_init (void) } }
+#ifdef CONFIG_OF_CONTROL
- /* For now, put this check after the console is ready */
- if (fdtdec_prepare_fdt()) {
panic("** CONFIG_OF_CONTROL defined but no FDT - please see "
"doc/README.fdt-control");
- } else
printf("DTB: 0x%x\n", (u32)gd->fdt_blob);
+#endif
- puts ("SDRAM :\n"); printf ("\t\tIcache:%s\n", icache_status() ? "ON" : "OFF"); printf ("\t\tDcache:%s\n", dcache_status() ? "ON" : "OFF");

On 08/07/2012 10:10 PM, Stephan Linz wrote:
Am Montag, den 06.08.2012, 09:46 +0200 schrieb Michal Simek:
This is minimum code required to be able to use device-tree for u-boot initialization. Currently only for device driver initialization.
Linker script change ensures DTB to be aligned for both options CONFIG_OF_EMBED and CONFIG_OF_SEPARATE.
Signed-off-by: Michal Simek monstr@monstr.eu CC: Simon Glass sjg@chromium.org
Acked-by: Stephan Linz linz@li-pro.net
Tested with AXI systems on Avnet S6LX150T and S6LX9 micro-evaluation.
Applied the whole series to microblaze custodian repo.
I have fixed small typo fault in 5/7 directly without sending v3 patch to mailing list.
Thanks, Michal
participants (2)
-
Michal Simek
-
Stephan Linz