summaryrefslogtreecommitdiffstats
path: root/arch/arm/lib/armlinux.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/lib/armlinux.c')
-rw-r--r--arch/arm/lib/armlinux.c108
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);
}