]> git.karo-electronics.de Git - karo-tx-uboot.git/blobdiff - common/cmd_pxe.c
gpio: atmel: add gpio common API support
[karo-tx-uboot.git] / common / cmd_pxe.c
index 59483a75c8fd7960b7dcb300a03ef5e3bebf37bf..a2fb50ab9d2e93e16d729de5f9f6190737448f06 100644 (file)
@@ -1,19 +1,9 @@
 /*
  * Copyright 2010-2011 Calxeda, Inc.
  *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the Free
- * Software Foundation; either version 2 of the License, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * this program.  If not, see <http://www.gnu.org/licenses/>.
+ * SPDX-License-Identifier:    GPL-2.0+
  */
+
 #include <common.h>
 #include <command.h>
 #include <malloc.h>
@@ -27,7 +17,9 @@
 #define MAX_TFTP_PATH_LEN 127
 
 const char *pxe_default_paths[] = {
+#ifdef CONFIG_SYS_SOC
        "default-" CONFIG_SYS_ARCH "-" CONFIG_SYS_SOC,
+#endif
        "default-" CONFIG_SYS_ARCH,
        "default",
        NULL
@@ -450,6 +442,7 @@ struct pxe_label {
        char *append;
        char *initrd;
        char *fdt;
+       int ipappend;
        int attempted;
        int localboot;
        int localboot_val;
@@ -583,7 +576,11 @@ static int label_boot(struct pxe_label *label)
 {
        char *bootm_argv[] = { "bootm", NULL, NULL, NULL, NULL };
        char initrd_str[22];
+       char mac_str[29] = "";
+       char ip_str[68] = "";
+       char *bootargs;
        int bootm_argc = 3;
+       int len = 0;
 
        label_print(label);
 
@@ -622,9 +619,39 @@ static int label_boot(struct pxe_label *label)
                return 1;
        }
 
-       if (label->append) {
-               setenv("bootargs", label->append);
-               printf("append: %s\n", label->append);
+       if (label->ipappend & 0x1) {
+               sprintf(ip_str, " ip=%s:%s:%s:%s",
+                       getenv("ipaddr"), getenv("serverip"),
+                       getenv("gatewayip"), getenv("netmask"));
+               len += strlen(ip_str);
+       }
+
+       if (label->ipappend & 0x2) {
+               int err;
+               strcpy(mac_str, " BOOTIF=");
+               err = format_mac_pxe(mac_str + 8, sizeof(mac_str) - 8);
+               if (err < 0)
+                       mac_str[0] = '\0';
+               len += strlen(mac_str);
+       }
+
+       if (label->append)
+               len += strlen(label->append);
+
+       if (len) {
+               bootargs = malloc(len + 1);
+               if (!bootargs)
+                       return 1;
+               bootargs[0] = '\0';
+               if (label->append)
+                       strcpy(bootargs, label->append);
+               strcat(bootargs, ip_str);
+               strcat(bootargs, mac_str);
+
+               setenv("bootargs", bootargs);
+               printf("append: %s\n", bootargs);
+
+               free(bootargs);
        }
 
        bootm_argv[1] = getenv("kernel_addr_r");
@@ -687,6 +714,7 @@ enum token_type {
        T_INCLUDE,
        T_FDT,
        T_ONTIMEOUT,
+       T_IPAPPEND,
        T_INVALID
 };
 
@@ -716,6 +744,7 @@ static const struct token keywords[] = {
        {"include", T_INCLUDE},
        {"fdt", T_FDT},
        {"ontimeout", T_ONTIMEOUT,},
+       {"ipappend", T_IPAPPEND,},
        {NULL, T_INVALID}
 };
 
@@ -1107,6 +1136,10 @@ static int parse_label(char **c, struct pxe_menu *cfg)
                        err = parse_integer(c, &label->localboot_val);
                        break;
 
+               case T_IPAPPEND:
+                       err = parse_integer(c, &label->ipappend);
+                       break;
+
                case T_EOL:
                        break;