--- zzzz-none-000/linux-2.6.28.10/arch/arm/kernel/setup.c 2009-05-02 18:54:43.000000000 +0000 +++ fusiv-7390-686/linux-2.6.28.10/arch/arm/kernel/setup.c 2010-03-25 13:19:24.000000000 +0000 @@ -24,6 +24,7 @@ #include #include #include +#include #include #include @@ -43,10 +44,14 @@ #include "compat.h" #include "atags.h" +#include + #ifndef MEM_SIZE #define MEM_SIZE (16*1024*1024) #endif +char eva_urlader_env[SZ_16K]; + #if defined(CONFIG_FPE_NWFPE) || defined(CONFIG_FPE_FASTFPE) char fpe_type[8]; @@ -196,6 +201,26 @@ "?(17)", }; +/* PROM environment functions */ +char *prom_getenv(char *env_name) { + /* + * Return a pointer to the given environment variable. prom_envp + * points to a null terminated array of pointers to variables. + */ + + char **var = (char **)eva_urlader_env; + int i = strlen(env_name); + + while (*var) { + if (strncmp(env_name, *var, i) == 0) { + return *(var+1); + } + var++; + } + return NULL; +} +EXPORT_SYMBOL(prom_getenv); + int cpu_architecture(void) { int cpu_arch; @@ -369,6 +394,8 @@ static void __init arm_add_memory(unsigned long start, unsigned long size) { + + /*--- printk("arm_add_memory: start=0x%lx size=0x%lx \n",start, size ); ---*/ struct membank *bank; /* @@ -495,6 +522,18 @@ if (kernel_data.start >= res->start && kernel_data.end <= res->end) request_resource(res, &kernel_data); +#if defined(CONFIG_ARCH_PUMA5) + { + extern struct resource *puma5_alloc_c55_code(unsigned long start, unsigned long end); + struct resource *pc55req; + pc55req = puma5_alloc_c55_code(res->start, res->end); + if(pc55req) { + request_resource(res, pc55req); + /*--- reserved memory for all time: ---*/ + reserve_bootmem(pc55req->start, pc55req->end - pc55req->start + 1, BOOTMEM_DEFAULT); + } + } +#endif/*--- #if defined(CONFIG_ARCH_PUMA5) ---*/ } if (mdesc->video_start) { @@ -537,8 +576,79 @@ __tagtable(ATAG_CORE, parse_tag_core); + +static int __init parse_tag_envp(const struct tag *tag) +{ + char *end; + char **start; + char **envp; + int mem = 0; + /*--- printk("starting parse_tag_envp\n"); ---*/ + envp = phys_to_virt(tag->u.envp.envp); + /*--- envp = (char**)ioremap(tag->u.envp.envp, 0x10000); ---*/ + /*--- printk("Envp-Addr= 0x%lx \n", (unsigned long)envp); ---*/ + if ( !envp || !*envp ) { + /*--- printk(KERN_DEBUG "[%s] envp == NULL \n", __FUNCTION__); ---*/ + return 0; + } + + /*--- printk("parse_tag_envp: envp=0x%lx, *envp=%lx \n", (unsigned long)envp, ((unsigned long)(*envp))); ---*/ + while((envp) && (*envp)) + { + /*--- printk("looping\n"); ---*/ + /*--- printk("mem=%d, [%s] \n", mem, *envp); ---*/ + mem += strlen(*envp) + 1 + sizeof(*envp); + envp++; + } + mem++; /*--- Fuer den terminalen NULL-Pointer ---*/ + + /*--- printk("final mem=%d \n", mem); ---*/ + BUG_ON(sizeof(eva_urlader_env) < mem); + envp = (char **)tag->u.envp.envp; + start = (char **)eva_urlader_env; + end = eva_urlader_env + mem; + + /*--- von vorne werden die Pointer eingefuegt von hinten die Daten ---*/ + while(envp && *envp) + { + int length = strlen(*envp); + if (length) + { + end -= length + 1; + strcpy(end, *envp); + } + else + { + end -= 2; + strcpy(end, ""); + } + *start++ = end; + BUG_ON(end < (char *)start); + envp++; + } + *start++ = NULL; /*--- Terminiation wird durch NULL-Pointer symbolisiert ---*/ + printk("annex: %s \n",prom_getenv("annex")); + return 0; +} + +__tagtable(ATAG_ENVP, parse_tag_envp); + + +/*------------------------------------------------------------------------------------------*\ +\*------------------------------------------------------------------------------------------*/ +static int __init parse_tag_wlandect_config(const struct tag *tag) { + + unsigned int value = tag->u.wlan_dect.address; + + set_wlan_dect_config_address(value); + return 0; + +} +__tagtable(ATAG_WLAN_DECT_CONF, parse_tag_wlandect_config); + static int __init parse_tag_mem32(const struct tag *tag) { + /*--- printk("************** \nParse_tag_mem32 \n**************\n"); ---*/ if (meminfo.nr_banks >= NR_BANKS) { printk(KERN_WARNING "Ignoring memory bank 0x%08x size %dKB\n", @@ -622,12 +732,12 @@ { extern struct tagtable __tagtable_begin, __tagtable_end; struct tagtable *t; - - for (t = &__tagtable_begin; t < &__tagtable_end; t++) + for (t = &__tagtable_begin; t < &__tagtable_end; t++) { if (tag->hdr.tag == t->tag) { t->parse(tag); break; } + } return t < &__tagtable_end; } @@ -640,9 +750,7 @@ { for (; t->hdr.size; t = tag_next(t)) if (!parse_tag(t)) - printk(KERN_WARNING - "Ignoring unrecognised tag 0x%08x\n", - t->hdr.tag); + printk(KERN_WARNING "Ignoring unrecognised tag 0x%08x\n", t->hdr.tag); } /* @@ -859,3 +967,6 @@ .stop = c_stop, .show = c_show }; + +extern void __gnu_mcount_nc(void); +EXPORT_SYMBOL(__gnu_mcount_nc);