diff options
Diffstat (limited to 'arch/arm/lib/armlinux.c')
-rw-r--r-- | arch/arm/lib/armlinux.c | 108 |
1 files changed, 75 insertions, 33 deletions
diff --git a/arch/arm/lib/armlinux.c b/arch/arm/lib/armlinux.c index d8ca47706d..bd9b72a8ac 100644 --- a/arch/arm/lib/armlinux.c +++ b/arch/arm/lib/armlinux.c @@ -27,7 +27,6 @@ #include <driver.h> #include <environment.h> #include <image.h> -#include <zlib.h> #include <init.h> #include <fs.h> #include <linux/list.h> @@ -37,6 +36,7 @@ #include <errno.h> #include <memory.h> #include <of.h> +#include <magicvar.h> #include <asm/byteorder.h> #include <asm/setup.h> @@ -45,11 +45,71 @@ #include <asm/system.h> static struct tag *params; -static int armlinux_architecture = 0; static void *armlinux_bootparams = NULL; -static unsigned int system_rev; -static u64 system_serial; +#ifndef CONFIG_ENVIRONMENT_VARIABLES +static int armlinux_architecture; +static u32 armlinux_system_rev; +static u64 armlinux_system_serial; +#endif + +BAREBOX_MAGICVAR(armlinux_architecture, "ARM machine ID"); +BAREBOX_MAGICVAR(armlinux_system_rev, "ARM system revision"); +BAREBOX_MAGICVAR(armlinux_system_serial, "ARM system serial"); + +void armlinux_set_architecture(int architecture) +{ +#ifdef CONFIG_ENVIRONMENT_VARIABLES + export_env_ull("armlinux_architecture", architecture); +#else + armlinux_architecture = architecture; +#endif +} + +int armlinux_get_architecture(void) +{ +#ifdef CONFIG_ENVIRONMENT_VARIABLES + return getenv_ull("armlinux_architecture"); +#else + return armlinux_architecture; +#endif +} + +void armlinux_set_revision(unsigned int rev) +{ +#ifdef CONFIG_ENVIRONMENT_VARIABLES + export_env_ull("armlinux_system_rev", rev); +#else + return armlinux_system_rev; +#endif +} + +unsigned int armlinux_get_revision(void) +{ +#ifdef CONFIG_ENVIRONMENT_VARIABLES + return getenv_ull("armlinux_system_rev"); +#else + return armlinux_system_rev; +#endif +} + +void armlinux_set_serial(u64 serial) +{ +#ifdef CONFIG_ENVIRONMENT_VARIABLES + export_env_ull("armlinux_system_serial", serial); +#else + armlinux_system_serial = serial; +#endif +} + +u64 armlinux_get_serial(void) +{ +#ifdef CONFIG_ENVIRONMENT_VARIABLES + return getenv_ull("armlinux_system_serial"); +#else + return armlinux_system_serial; +#endif +} static void setup_start_tag(void) { @@ -117,6 +177,8 @@ static void setup_commandline_tag(const char *commandline, int swap) static void setup_revision_tag(void) { + u32 system_rev = armlinux_get_revision(); + if (system_rev) { params->hdr.tag = ATAG_REVISION; params->hdr.size = tag_size(tag_revision); @@ -129,6 +191,8 @@ static void setup_revision_tag(void) static void setup_serial_tag(void) { + u64 system_serial = armlinux_get_serial(); + if (system_serial) { params->hdr.tag = ATAG_SERIAL; params->hdr.size = tag_size(tag_serialnr); @@ -140,7 +204,7 @@ static void setup_serial_tag(void) } } -static void setup_initrd_tag(image_header_t *header) +static void setup_initrd_tag(unsigned long start, unsigned long size) { /* an ATAG_INITRD node tells the kernel where the compressed * ramdisk can be found. ATAG_RDIMG is a better name, actually. @@ -148,8 +212,8 @@ static void setup_initrd_tag(image_header_t *header) params->hdr.tag = ATAG_INITRD2; params->hdr.size = tag_size(tag_initrd); - params->u.initrd.start = image_get_load(header); - params->u.initrd.size = image_get_data_size(header); + params->u.initrd.start = start; + params->u.initrd.size = size; params = tag_next(params); } @@ -168,15 +232,15 @@ static void setup_tags(struct image_data *data, int swap) setup_memory_tags(); setup_commandline_tag(commandline, swap); - if (data && data->initrd) - setup_initrd_tag (&data->initrd->header); + if (data && (data->initrd_size > 0)) + setup_initrd_tag(data->initrd_address, data->initrd_size); setup_revision_tag(); setup_serial_tag(); setup_end_tag(); printf("commandline: %s\n" - "arch_number: %d\n", commandline, armlinux_architecture); + "arch_number: %d\n", commandline, armlinux_get_architecture()); } @@ -185,28 +249,6 @@ void armlinux_set_bootparams(void *params) armlinux_bootparams = params; } -void armlinux_set_architecture(int architecture) -{ - char *arch_number = asprintf("%d", architecture); - - armlinux_architecture = architecture; - - setenv("arch_number", arch_number); - export("arch_number"); - - kfree(arch_number); -} - -void armlinux_set_revision(unsigned int rev) -{ - system_rev = rev; -} - -void armlinux_set_serial(u64 serial) -{ - system_serial = serial; -} - void start_linux(void *adr, int swap, struct image_data *data) { void (*kernel)(int zero, int arch, void *params) = adr; @@ -229,5 +271,5 @@ void start_linux(void *adr, int swap, struct image_data *data) __asm__ __volatile__("mcr p15, 0, %0, c1, c0" :: "r" (reg)); } - kernel(0, armlinux_architecture, params); + kernel(0, armlinux_get_architecture(), params); } |