From 7067e21f3f6f4744ccfb77868a0ae2da9cbf3fbc Mon Sep 17 00:00:00 2001 From: Robert Schwebel Date: Wed, 28 Nov 2007 09:03:27 +0100 Subject: cleanup do_bootm_linux() This patch cleans up the do_bootm_linux() function. It removes most of the uggly ifdefery and replaces it by a sane function optimizing structure. Signed-off-by: Robert Schwebel --- arch/arm/lib/armlinux.c | 227 ++++++++++++++++++++++++++---------------------- include/boot.h | 6 +- include/image.h | 2 + 3 files changed, 127 insertions(+), 108 deletions(-) diff --git a/arch/arm/lib/armlinux.c b/arch/arm/lib/armlinux.c index f4bb814a60..c66560f250 100644 --- a/arch/arm/lib/armlinux.c +++ b/arch/arm/lib/armlinux.c @@ -21,44 +21,84 @@ * */ +#include #include #include #include +#include #include #include + #include +#include #include -#include -#include #include +static struct tag *params; + #if defined (CONFIG_SETUP_MEMORY_TAGS) || \ defined (CONFIG_CMDLINE_TAG) || \ defined (CONFIG_INITRD_TAG) || \ defined (CONFIG_SERIAL_TAG) || \ defined (CONFIG_REVISION_TAG) || \ - defined (CONFIG_VFD) || \ - defined (CONFIG_LCD) -static void setup_start_tag (void); + defined (CONFIG_LCD) || \ + defined (CONFIG_VFD) +static void __setup_start_tag(void); +static void __setup_end_tag(void); +#define setup_start_tag __setup_start_tag +#define setup_end_tag __setup_end_tag +#else +#define setup_start_tag() do {} while(0) +#define setup_end_tag() do {} while(0) +#endif + +#ifdef CONFIG_CMDLINE_TAG +static void __setup_commandline_tag(const char *commandline); +#define setup_commandline_tag __setup_commandline_tag +#else +#define setup_commandline_tag(a) do {} while(0) +#endif + +#ifdef CONFIG_SETUP_MEMORY_TAGS +static void __setup_memory_tags(void); +#define setup_memory_tags __setup_memory_tags +#else +#define setup_memory_tags() do {} while(0) +#endif + +#if 0 +#ifdef CONFIG_INITRD_TAG +static void __setup_initrd_tag(ulong initrd_start, ulong initrd_end); +#define setup_initrd_tag __setup_initrd_tag +#else +#define setup_initrd_tag(a,b) do {} while(0) +#endif +#endif + +extern ulong calc_fbsize(void); +#if defined (CONFIG_VFD) || defined (CONFIG_LCD) +static void __setup_videolfb_tag(gd_t *gd); +#define setup_videolfb_tag __setup_videolfb_tag +#else +#define setup_videolfb_tag(a) do {} while(0) +#endif -# ifdef CONFIG_SETUP_MEMORY_TAGS -static void setup_memory_tags (void); -# endif -static void setup_commandline_tag (const char *commandline); +#ifdef CONFIG_REVISION_TAG +static void __setup_revision_tag(struct tag **in_params); +#define setup_revision_tag __setup_revision_tag +#else +#define setup_revision_tag(a) do {} while(0) +#endif -# ifdef CONFIG_INITRD_TAG -static void setup_initrd_tag (ulong initrd_start, - ulong initrd_end); -# endif -static void setup_end_tag (void); +#ifdef CONFIG_SERIAL_TAG +void __setup_serial_tag(struct tag **tmp); +#define setup_serial tag __setup_serial_tag +#else +#define setup_serial_tag(a) do {} while(0) +#endif -# if defined (CONFIG_VFD) || defined (CONFIG_LCD) -static void setup_videolfb_tag (gd_t *gd); -# endif -static struct tag *params; -#endif /* CONFIG_SETUP_MEMORY_TAGS || CONFIG_CMDLINE_TAG || CONFIG_INITRD_TAG */ #ifdef CONFIG_SHOW_BOOT_PROGRESS # include @@ -68,13 +108,13 @@ static struct tag *params; #endif -int do_bootm_linux(struct image_handle *os_handle, struct image_handle *initrd) +int +do_bootm_linux(struct image_handle *os_handle, struct image_handle *initrd) { void (*theKernel)(int zero, int arch, uint params); image_header_t *os_header = &os_handle->header; -#ifdef CONFIG_CMDLINE_TAG const char *commandline = getenv ("bootargs"); -#endif + if (os_header->ih_type == IH_TYPE_MULTI) { printf("Multifile images not handled at the moment\n"); return -1; @@ -84,38 +124,22 @@ int do_bootm_linux(struct image_handle *os_handle, struct image_handle *initrd) theKernel = (void (*)(int, int, uint))ntohl((unsigned long)(os_header->ih_ep)); + /* FIXME: replace by pr_debug */ debug ("## Transferring control to Linux (at address %08lx) ...\n", (ulong) theKernel); -#if defined (CONFIG_SETUP_MEMORY_TAGS) || \ - defined (CONFIG_CMDLINE_TAG) || \ - defined (CONFIG_INITRD_TAG) || \ - defined (CONFIG_SERIAL_TAG) || \ - defined (CONFIG_REVISION_TAG) || \ - defined (CONFIG_LCD) || \ - defined (CONFIG_VFD) - setup_start_tag (); -#ifdef CONFIG_SERIAL_TAG - setup_serial_tag (¶ms); -#endif -#ifdef CONFIG_REVISION_TAG - setup_revision_tag (¶ms); -#endif -#ifdef CONFIG_SETUP_MEMORY_TAGS - setup_memory_tags (); -#endif -#ifdef CONFIG_CMDLINE_TAG - setup_commandline_tag (commandline); -#endif -#ifdef CONFIG_INITRD_TAG -// if (initrd_start && initrd_end) -// setup_initrd_tag (initrd_start, initrd_end); -#endif -#if defined (CONFIG_VFD) || defined (CONFIG_LCD) - setup_videolfb_tag ((gd_t *) gd); -#endif - setup_end_tag (); + setup_start_tag(); + setup_serial_tag(¶ms); + setup_revision_tag(¶ms); + setup_memory_tags(); + setup_commandline_tag(commandline); +#if 0 + if (initrd_start && initrd_end) + setup_initrd_tag (initrd_start, initrd_end); #endif + setup_videolfb_tag((gd_t *) gd); + setup_end_tag(); + if (relocate_image(os_handle, (void *)ntohl(os_header->ih_load))) return -1; @@ -124,61 +148,55 @@ int do_bootm_linux(struct image_handle *os_handle, struct image_handle *initrd) #ifdef CONFIG_USB_DEVICE { - extern void udc_disconnect (void); - udc_disconnect (); + extern void udc_disconnect(void); + udc_disconnect(); } #endif - cleanup_before_linux (); - + cleanup_before_linux(); theKernel (0, CONFIG_ARCH_NUMBER, CONFIG_BOOT_PARAMS); + return -1; } -#if defined (CONFIG_SETUP_MEMORY_TAGS) || \ - defined (CONFIG_CMDLINE_TAG) || \ - defined (CONFIG_INITRD_TAG) || \ - defined (CONFIG_SERIAL_TAG) || \ - defined (CONFIG_REVISION_TAG) || \ - defined (CONFIG_LCD) || \ - defined (CONFIG_VFD) -static void setup_start_tag (void) +void +__setup_start_tag(void) { - params = (struct tag *) CONFIG_BOOT_PARAMS; + params = (struct tag *)CONFIG_BOOT_PARAMS; params->hdr.tag = ATAG_CORE; - params->hdr.size = tag_size (tag_core); + params->hdr.size = tag_size(tag_core); params->u.core.flags = 0; params->u.core.pagesize = 0; params->u.core.rootdev = 0; - params = tag_next (params); + params = tag_next(params); } -#ifdef CONFIG_SETUP_MEMORY_TAGS -static void setup_memory_tags (void) +void +__setup_memory_tags(void) { struct device_d *dev = NULL; list_for_each_entry(dev, &device_list, list) { if (dev->type == DEVICE_TYPE_DRAM) { params->hdr.tag = ATAG_MEM; - params->hdr.size = tag_size (tag_mem32); + params->hdr.size = tag_size(tag_mem32); params->u.mem.start = dev->map_base; params->u.mem.size = dev->size; - params = tag_next (params); + params = tag_next(params); } } } -#endif /* CONFIG_SETUP_MEMORY_TAGS */ -static void setup_commandline_tag (const char *commandline) +void +__setup_commandline_tag(const char *commandline) { const char *p; @@ -186,9 +204,10 @@ static void setup_commandline_tag (const char *commandline) return; /* eat leading white space */ - for (p = commandline; *p == ' '; p++); + for (p = commandline; *p == ' '; p++) ; - /* skip non-existent command lines so the kernel will still + /* + * skip non-existent command lines so the kernel will still * use its default command line. */ if (*p == '\0') @@ -196,34 +215,32 @@ static void setup_commandline_tag (const char *commandline) params->hdr.tag = ATAG_CMDLINE; params->hdr.size = - (sizeof (struct tag_header) + strlen (p) + 1 + 4) >> 2; + (sizeof (struct tag_header) + strlen(p) + 1 + 4) >> 2; - strcpy (params->u.cmdline.cmdline, p); + strcpy(params->u.cmdline.cmdline, p); - params = tag_next (params); + params = tag_next(params); } -#ifdef CONFIG_INITRD_TAG -static void setup_initrd_tag (ulong initrd_start, ulong initrd_end) +void +__setup_initrd_tag(ulong initrd_start, ulong initrd_end) { /* an ATAG_INITRD node tells the kernel where the compressed * ramdisk can be found. ATAG_RDIMG is a better name, actually. */ params->hdr.tag = ATAG_INITRD2; - params->hdr.size = tag_size (tag_initrd); + params->hdr.size = tag_size(tag_initrd); params->u.initrd.start = initrd_start; params->u.initrd.size = initrd_end - initrd_start; - params = tag_next (params); + params = tag_next(params); } -#endif /* CONFIG_INITRD_TAG */ - -#if defined (CONFIG_VFD) || defined (CONFIG_LCD) -extern ulong calc_fbsize (void); -static void setup_videolfb_tag (gd_t *gd) +#if 0 /* FIXME: doesn't compile */ +void +__setup_videolfb_tag(gd_t *gd) { /* An ATAG_VIDEOLFB node tells the kernel where and how large * the framebuffer for video was allocated (among other things). @@ -233,19 +250,18 @@ static void setup_videolfb_tag (gd_t *gd) * in the tag_videolfb are not of interest. */ params->hdr.tag = ATAG_VIDEOLFB; - params->hdr.size = tag_size (tag_videolfb); + params->hdr.size = tag_size(tag_videolfb); - params->u.videolfb.lfb_base = (u32) gd->fb_base; - /* Fb size is calculated according to parameters for our panel - */ + params->u.videolfb.lfb_base = (u32)gd->fb_base; + /* Fb size is calculated according to parameters for our panel */ params->u.videolfb.lfb_size = calc_fbsize(); - params = tag_next (params); + params = tag_next(params); } -#endif /* CONFIG_VFD || CONFIG_LCD */ - -#ifdef CONFIG_SERIAL_TAG -void setup_serial_tag (struct tag **tmp) +#endif +#if 0 /* FIXME: doesn't compile */ +void +__setup_serial_tag(struct tag **tmp) { struct tag *params = *tmp; struct tag_serialnr serialnr; @@ -253,33 +269,32 @@ void setup_serial_tag (struct tag **tmp) get_board_serial(&serialnr); params->hdr.tag = ATAG_SERIAL; - params->hdr.size = tag_size (tag_serialnr); + params->hdr.size = tag_size(tag_serialnr); params->u.serialnr.low = serialnr.low; - params->u.serialnr.high= serialnr.high; - params = tag_next (params); + params->u.serialnr.high = serialnr.high; + params = tag_next(params); *tmp = params; } #endif - -#ifdef CONFIG_REVISION_TAG -void setup_revision_tag(struct tag **in_params) +#if 0 /* FIXME: doesn't compile */ +void +__setup_revision_tag(struct tag **in_params) { u32 rev = 0; u32 get_board_rev(void); rev = get_board_rev(); params->hdr.tag = ATAG_REVISION; - params->hdr.size = tag_size (tag_revision); + params->hdr.size = tag_size(tag_revision); params->u.revision.rev = rev; - params = tag_next (params); + params = tag_next(params); } -#endif /* CONFIG_REVISION_TAG */ - +#endif -static void setup_end_tag (void) +void +__setup_end_tag (void) { params->hdr.tag = ATAG_NONE; params->hdr.size = 0; } -#endif /* CONFIG_SETUP_MEMORY_TAGS || CONFIG_CMDLINE_TAG || CONFIG_INITRD_TAG */ diff --git a/include/boot.h b/include/boot.h index 889773bc2c..6fc7b05b60 100644 --- a/include/boot.h +++ b/include/boot.h @@ -1,11 +1,13 @@ #ifndef __BOOT_H #define __BOOT_H +#include + #ifdef CONFIG_OF_FLAT_TREE -int do_bootm_linux(struct image_handle *os, struct image_handle *initrd, +extern int do_bootm_linux(struct image_handle *os, struct image_handle *initrd, const char *oftree); #else -int do_bootm_linux(struct image_handle *os, struct image_handle *initrd); +extern int do_bootm_linux(struct image_handle *os, struct image_handle *initrd); #endif #endif /* __BOOT_H */ diff --git a/include/image.h b/include/image.h index d657efa0a5..0d2f47292b 100644 --- a/include/image.h +++ b/include/image.h @@ -31,6 +31,8 @@ #ifndef __IMAGE_H__ #define __IMAGE_H__ +#include + /* * Operating System Codes */ -- cgit v1.2.3