* [PATCH] ARM: boards: kindle mx50: extend vendor ATAGs
@ 2025-08-31 6:45 Alexander Kurz
0 siblings, 0 replies; only message in thread
From: Alexander Kurz @ 2025-08-31 6:45 UTC (permalink / raw)
To: Sascha Hauer, barebox; +Cc: Alexander Kurz
Board and device specific details are passed to the factory-shipped
kernel as ATAG, e.g. board type and device serial number.
Extend the list of vendor specific ATAGs with wifi and bootmode
parameters to improve compatibility with the factory shipped
installation, e.g. to get the wifi MAC address correctly set.
Signed-off-by: Alexander Kurz <akurz@blala.de>
---
arch/arm/boards/kindle-mx50/board.c | 155 +++++++++++++++++++---------
1 file changed, 109 insertions(+), 46 deletions(-)
diff --git a/arch/arm/boards/kindle-mx50/board.c b/arch/arm/boards/kindle-mx50/board.c
index a5c81ac8e7..81fda48248 100644
--- a/arch/arm/boards/kindle-mx50/board.c
+++ b/arch/arm/boards/kindle-mx50/board.c
@@ -21,87 +21,150 @@
#include <mach/imx/imx5.h>
#include <mach/imx/revision.h>
-/* 16 byte id for serial number */
+/* 16 byte id for the device serial number */
#define ATAG_SERIAL16 0x5441000a
/* 16 byte id for a board revision */
#define ATAG_REVISION16 0x5441000b
+/* mac address / secret */
+#define ATAG_MACADDR 0x5441000d
+/* 2x 16 byte /proc/bootmode */
+#define ATAG_BOOTMODE 0x5441000f
-struct char16_tag {
+struct tag_char16 {
char data[16];
};
+struct tag_macaddr {
+ char address[12];
+ char secret[20];
+};
+
+struct tag_bootmode {
+ char boot[16];
+ char post[16];
+};
+
static struct tag *setup_16char_tag(struct tag *params, uint32_t tag,
const char *value)
{
- struct char16_tag *target;
- target = ((void *) params) + sizeof(struct tag_header);
+ struct tag_char16 *target;
+
+ target = (void *)params + sizeof(struct tag_header);
+ params->hdr.tag = tag;
+ params->hdr.size = tag_size(tag_char16);
+ memset(target->data, 0, sizeof(target->data));
+ /* don't care for missing null terminators */
+ strncpy(target->data, value, sizeof(target->data));
+ return tag_next(params);
+}
+
+static struct tag *setup_macaddr_tag(struct tag *params, uint32_t tag,
+ const char *addr, const char *secret)
+{
+ struct tag_macaddr *target;
+
+ target = (void *)params + sizeof(struct tag_header);
+ params->hdr.tag = tag;
+ params->hdr.size = tag_size(tag_macaddr);
+ memset(target->address, 0, sizeof(target->address));
+ memset(target->secret, 0, sizeof(target->secret));
+ strncpy(target->address, addr, sizeof(target->address));
+ strncpy(target->secret, secret, sizeof(target->secret));
+ return tag_next(params);
+}
+
+static struct tag *setup_bootmode_tag(struct tag *params, uint32_t tag,
+ const char *bootmode, const char *postmode)
+{
+ struct tag_bootmode *target;
+
+ target = (void *) params + sizeof(struct tag_header);
params->hdr.tag = tag;
- params->hdr.size = tag_size(char16_tag);
- memcpy(target->data, value, sizeof target->data);
+ params->hdr.size = tag_size(tag_macaddr);
+ memset(target->boot, 0, sizeof(target->boot));
+ memset(target->post, 0, sizeof(target->post));
+ strncpy(target->boot, bootmode, sizeof(target->boot));
+ strncpy(target->post, postmode, sizeof(target->post));
return tag_next(params);
}
-static const char *get_env_16char_tag(const char *tag)
+static const char *get_env_char_tag(const char *tag, const char *defaultval)
{
- static const char *default16 = "0000000000000000";
const char *value;
value = getenv(tag);
if (!value) {
- pr_err("env var %s not found, using default\n", tag);
- return default16;
+ printf("env var %s not found, using default\n", tag);
+ return defaultval;
}
- if (strlen(value) != 16) {
- pr_err("env var %s: expecting 16 characters, using default\n",
- tag);
- return default16;
- }
- pr_info("%s: %s\n", tag, value);
return value;
}
BAREBOX_MAGICVAR(global.board.serial16,
- "Pass the kindle Serial as vendor-specific ATAG to linux");
+ "The device serial in ATAG_SERIAL16, visible in /proc/cpuinfo");
BAREBOX_MAGICVAR(global.board.revision16,
- "Pass the kindle BoardId as vendor-specific ATAG to linux");
+ "The boardid in ATAG_REVISION16 to fill /proc/boardid");
+BAREBOX_MAGICVAR(global.board.mac,
+ "The wifi MAC in ATAG_MACADDR visible as /proc/mac_addr");
+BAREBOX_MAGICVAR(global.board.sec,
+ "The sec code in ATAG_MACADDR visible as /proc/mac_sec");
+BAREBOX_MAGICVAR(global.board.bootmode,
+ "The bootmode in ATAG_BOOTMODE to fill /proc/bootmode");
+BAREBOX_MAGICVAR(global.board.postmode,
+ "The postmode in ATAG_BOOTMODE to fill /proc/postmode");
+
+static struct envdata {
+ size_t offset;
+ size_t size;
+ const char *env_name;
+ char *data;
+} kindle_mx50_boardinfo[] = {
+ { 0x0, 16, "board.serial16" },
+ { 0x60, 16, "board.revision16" },
+ { 0x30, 16, "board.mac" },
+ { 0x40, 20, "board.sec" },
+ { 0x1000, 16, "board.bootmode" },
+ { 0x1010, 16, "board.postmode" },
+};
-/* The Kindle Kernel expects two custom ATAGs, ATAG_REVISION16 describing
- * the board and ATAG_SERIAL16 to identify the individual device.
- */
+/* The original kernel expects multiple custom ATAGs. */
static struct tag *kindle_mx50_append_atags(struct tag *params)
{
params = setup_16char_tag(params, ATAG_SERIAL16,
- get_env_16char_tag("global.board.serial16"));
+ get_env_char_tag("global.board.serial16",
+ "0000000000000000"));
params = setup_16char_tag(params, ATAG_REVISION16,
- get_env_16char_tag("global.board.revision16"));
+ get_env_char_tag("global.board.revision16",
+ "0000000000000000"));
+ params = setup_macaddr_tag(params, ATAG_MACADDR,
+ get_env_char_tag("global.board.mac",
+ "000000000000"),
+ get_env_char_tag("global.board.sec",
+ "00000000000000000000"));
+ params = setup_bootmode_tag(params, ATAG_BOOTMODE,
+ get_env_char_tag("global.board.bootmode", ""),
+ get_env_char_tag("global.board.postmode", ""));
return params;
}
-static char *serial16;
-static char *revision16;
-static char *mac;
-
-static void kindle_rev_init(void)
+static void kindle_rev_init(const char *part, struct envdata *env, size_t num)
{
- int ret;
void *buf;
- const char userdata[] = "/dev/mmc2.boot0.userdata";
- ret = read_file_2(userdata, NULL, &buf, 128);
+
+ int ret = read_file_2(part, NULL, &buf, 0x1060);
if (ret && ret != -EFBIG) {
- pr_err("Could not read board info from %s\n", userdata);
+ pr_err("Could not read board info from %s\n", part);
return;
}
-
- serial16 = xzalloc(17);
- revision16 = xzalloc(17);
- mac = xzalloc(17);
-
- memcpy(serial16, buf, 16);
- memcpy(revision16, buf + 96, 16);
- memcpy(mac, buf + 48, 16);
-
- globalvar_add_simple_string("board.serial16", &serial16);
- globalvar_add_simple_string("board.revision16", &revision16);
- globalvar_add_simple_string("board.mac", &mac);
+ for (int i = 0; i < num; i++) {
+ size_t offset = env[i].offset;
+ size_t size = env[i].size;
+ const char *name = env[i].env_name;
+
+ env[i].data = xzalloc(size + 1);
+ env[i].data[size] = 0;
+ memcpy(env[i].data, buf + offset, size);
+ globalvar_add_simple_string(name, &env[i].data);
+ }
free(buf);
}
@@ -121,8 +184,8 @@ static int kindle_mx50_late_init(void)
armlinux_set_revision(0x50000 | imx_silicon_revision());
/* Compatibility ATAGs for original kernel */
armlinux_set_atag_appender(kindle_mx50_append_atags);
-
- kindle_rev_init();
+ kindle_rev_init("/dev/mmc2.boot0.userdata", kindle_mx50_boardinfo,
+ ARRAY_SIZE(kindle_mx50_boardinfo));
return 0;
}
--
2.39.5
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2025-08-31 6:41 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-08-31 6:45 [PATCH] ARM: boards: kindle mx50: extend vendor ATAGs Alexander Kurz
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox