--- zzzz-none-000/linux-2.6.39.4/arch/arm/kernel/setup.c 2011-08-03 19:43:28.000000000 +0000 +++ puma6-atom-6490-729/linux-2.6.39.4/arch/arm/kernel/setup.c 2021-11-10 13:38:14.000000000 +0000 @@ -7,6 +7,12 @@ * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ + +/* + Includes Intel Corporation's changes/modifications dated: December 20, 2013. + Changed/modified portions - Copyright © 2013, Intel Corporation. +*/ + #include #include #include @@ -54,10 +60,14 @@ #include "atags.h" #include "tcm.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]; @@ -207,6 +217,27 @@ "?(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+=2; + } + return NULL; +} +EXPORT_SYMBOL(prom_getenv); + + int cpu_architecture(void) { int cpu_arch; @@ -567,6 +598,18 @@ if (kernel_data.start >= res->start && kernel_data.end <= res->end) request_resource(res, &kernel_data); +#if defined(CONFIG_ARCH_PUMA5) || defined(CONFIG_MACH_PUMA6) + { + 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) { @@ -611,11 +654,82 @@ 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", + tag->u.mem.start, tag->u.mem.size / 1024); + return -EINVAL; + } return arm_add_memory(tag->u.mem.start, tag->u.mem.size); } __tagtable(ATAG_MEM, parse_tag_mem32); +/*------------------------------------------------------------------------------------------*\ +\*------------------------------------------------------------------------------------------*/ +static int __init parse_tag_envp(const struct tag *tag) +{ + char *end; + char **start; + char **envp; + int mem = 0; + /*--- printk("starting parse_tag_envp: %x\n", tag->u.envp.envp); ---*/ + envp = phys_to_virt(tag->u.envp.envp); + /*--- 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+= sizeof(*envp); /*--- 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); + + end -= length + 1; + strcpy(end, *envp); + + *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); + #if defined(CONFIG_VGA_CONSOLE) || defined(CONFIG_DUMMY_CONSOLE) struct screen_info screen_info = { .orig_video_lines = 30, @@ -802,12 +916,21 @@ struct machine_desc *mdesc; char *from = default_command_line; + /* here and below PHYS_OFFSET definition depends on + * CONFIG_ARM_PATCH_PHYS_VIRT. + * If this option is enabled variable is used instead. + */ init_tags.mem.start = PHYS_OFFSET; unwind_init(); setup_processor(); mdesc = setup_machine(machine_arch_type); + if (machine_arch_type == MACH_TYPE_PUMA5 || + machine_arch_type == MACH_TYPE_PUMA6) { + mdesc->boot_params = PHYS_OFFSET + + CONFIG_ARM_AVALANCHE_KERNEL_PARAMS_OFFSET; + } machine_desc = mdesc; machine_name = mdesc->name;