Re: [PATCH 2/2] bootwrapper: Add PlanetCore firmware support.

2007-09-24 Thread David Gibson
On Mon, Sep 24, 2007 at 03:09:49PM -0500, Scott Wood wrote:
 This is a library that board code can use to extract information from the
 PlanetCore configuration keys.  PlanetCore is used on various boards from
 Embedded Planet.
 
 Signed-off-by: Scott Wood [EMAIL PROTECTED]
Acked-by: David Gibson [EMAIL PROTECTED]

-- 
David Gibson| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au  | minimalist, thank you.  NOT _the_ _other_
| _way_ _around_!
http://www.ozlabs.org/~dgibson
___
Linuxppc-dev mailing list
Linuxppc-dev@ozlabs.org
https://ozlabs.org/mailman/listinfo/linuxppc-dev


[PATCH 2/2] bootwrapper: Add PlanetCore firmware support.

2007-09-20 Thread Scott Wood
This is a library that board code can use to extract information from the
PlanetCore configuration keys.  PlanetCore is used on various boards from
Embedded Planet.

Signed-off-by: Scott Wood [EMAIL PROTECTED]
---
This replaces the previous Add PlanetCore firmware support patch.

Besides using dt_set_mac_address(), it fixes a bug with MAC address
generation -- it previously assumed that the mac address in the environment
was of the first ethernet port, when it's actually of the currently
configured ethernet port.

 arch/powerpc/boot/Makefile |2 +-
 arch/powerpc/boot/planetcore.c |  166 
 arch/powerpc/boot/planetcore.h |   49 
 3 files changed, 216 insertions(+), 1 deletions(-)
 create mode 100644 arch/powerpc/boot/planetcore.c
 create mode 100644 arch/powerpc/boot/planetcore.h

diff --git a/arch/powerpc/boot/Makefile b/arch/powerpc/boot/Makefile
index cffef14..9ec785c 100644
--- a/arch/powerpc/boot/Makefile
+++ b/arch/powerpc/boot/Makefile
@@ -45,7 +45,7 @@ src-wlib := string.S crt0.S stdio.c main.c flatdevtree.c 
flatdevtree_misc.c \
ns16550.c serial.c simple_alloc.c div64.S util.S \
gunzip_util.c elf_util.c $(zlib) devtree.c oflib.c ofconsole.c \
4xx.c ebony.c mv64x60.c mpsc.c mv64x60_i2c.c cuboot.c bamboo.c \
-   cpm-serial.c stdlib.c
+   cpm-serial.c stdlib.c planetcore.c
 src-plat := of.c cuboot-83xx.c cuboot-85xx.c holly.c \
cuboot-ebony.c treeboot-ebony.c prpmc2800.c \
ps3-head.S ps3-hvcall.S ps3.c treeboot-bamboo.c cuboot-8xx.c \
diff --git a/arch/powerpc/boot/planetcore.c b/arch/powerpc/boot/planetcore.c
new file mode 100644
index 000..203f296
--- /dev/null
+++ b/arch/powerpc/boot/planetcore.c
@@ -0,0 +1,166 @@
+/*
+ * PlanetCore configuration data support functions
+ *
+ * Author: Scott Wood [EMAIL PROTECTED]
+ *
+ * Copyright (c) 2007 Freescale Semiconductor, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 as published
+ * by the Free Software Foundation.
+ */
+
+#include stdio.h
+#include stdlib.h
+#include ops.h
+#include planetcore.h
+#include io.h
+
+/* PlanetCore passes information to the OS in the form of
+ * a table of key=value strings, separated by newlines.
+ *
+ * The list is terminated by an empty string (i.e. two
+ * consecutive newlines).
+ *
+ * To make it easier to parse, we first convert all the
+ * newlines into null bytes.
+ */
+
+void planetcore_prepare_table(char *table)
+{
+   do {
+   if (*table == '\n')
+   *table = 0;
+
+   table++;
+   } while (*(table - 1) || *table != '\n');
+
+   *table = 0;
+}
+
+const char *planetcore_get_key(const char *table, const char *key)
+{
+   int keylen = strlen(key);
+
+   do {
+   if (!strncmp(table, key, keylen)  table[keylen] == '=')
+   return table + keylen + 1;
+
+   table += strlen(table) + 1;
+   } while (strlen(table) != 0);
+
+   return NULL;
+}
+
+int planetcore_get_decimal(const char *table, const char *key, u64 *val)
+{
+   const char *str = planetcore_get_key(table, key);
+   if (!str)
+   return 0;
+
+   *val = strtoull(str, NULL, 10);
+   return 1;
+}
+
+int planetcore_get_hex(const char *table, const char *key, u64 *val)
+{
+   const char *str = planetcore_get_key(table, key);
+   if (!str)
+   return 0;
+
+   *val = strtoull(str, NULL, 16);
+   return 1;
+}
+
+static u64 mac_table[4] = {
+   0x,
+   0x0080,
+   0x0040,
+   0x00c0,
+};
+
+void planetcore_set_mac_addrs(const char *table)
+{
+   u8 addr[4][6];
+   u64 int_addr;
+   u32 i;
+   int j;
+
+   if (!planetcore_get_hex(table, PLANETCORE_KEY_MAC_ADDR, int_addr))
+   return;
+
+   for (i = 0; i  4; i++) {
+   u64 this_dev_addr = (int_addr  ~0x00c0) |
+   mac_table[i];
+
+   for (j = 5; j = 0; j--) {
+   addr[i][j] = this_dev_addr  0xff;
+   this_dev_addr = 8;
+   }
+
+   dt_set_mac_address(i, addr[i]);
+   }
+}
+
+static char prop_buf[MAX_PROP_LEN];
+
+void planetcore_set_stdout_path(const char *table)
+{
+   char *path;
+   const char *label;
+   void *node, *chosen;
+
+   label = planetcore_get_key(table, PLANETCORE_KEY_SERIAL_PORT);
+   if (!label)
+   return;
+
+   node = find_node_by_prop_value_str(NULL, linux,planetcore-label,
+  label);
+   if (!node)
+   return;
+
+   path = get_path(node, prop_buf, MAX_PROP_LEN);
+   if (!path)
+   return;
+
+   chosen = finddevice(/chosen);
+   if