root/arch/mips/fw/lib/cmdline.c
/*
 * This file is subject to the terms and conditions of the GNU General Public
 * License.  See the file "COPYING" in the main directory of this archive
 * for more details.
 *
 * Copyright (C) 2012 MIPS Technologies, Inc.  All rights reserved.
 */
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/string.h>

#include <asm/addrspace.h>
#include <asm/fw/fw.h>

int fw_argc;
int *_fw_argv;
int *_fw_envp;

#ifndef CONFIG_HAVE_PLAT_FW_INIT_CMDLINE
void __init fw_init_cmdline(void)
{
        int i;

        /* Validate command line parameters. */
        if ((fw_arg0 >= CKSEG0) || (fw_arg1 < CKSEG0)) {
                fw_argc = 0;
                _fw_argv = NULL;
        } else {
                fw_argc = (fw_arg0 & 0x0000ffff);
                _fw_argv = (int *)fw_arg1;
        }

        /* Validate environment pointer. */
        if (fw_arg2 < CKSEG0)
                _fw_envp = NULL;
        else
                _fw_envp = (int *)fw_arg2;

        for (i = 1; i < fw_argc; i++) {
                strlcat(arcs_cmdline, fw_argv(i), COMMAND_LINE_SIZE);
                if (i < (fw_argc - 1))
                        strlcat(arcs_cmdline, " ", COMMAND_LINE_SIZE);
        }
}
#endif

char * __init fw_getcmdline(void)
{
        return &(arcs_cmdline[0]);
}

char *fw_getenv(char *envname)
{
        char *result = NULL;

        if (_fw_envp != NULL && fw_envp(0) != NULL) {
                /*
                 * Return a pointer to the given environment variable.
                 * YAMON uses "name", "value" pairs, while U-Boot uses
                 * "name=value".
                 */
                int i, yamon, index = 0;

                yamon = (strchr(fw_envp(index), '=') == NULL);
                i = strlen(envname);

                while (fw_envp(index)) {
                        if (strncmp(envname, fw_envp(index), i) == 0) {
                                if (yamon) {
                                        result = fw_envp(index + 1);
                                        break;
                                } else if (fw_envp(index)[i] == '=') {
                                        result = fw_envp(index) + i + 1;
                                        break;
                                }
                        }

                        /* Increment array index. */
                        if (yamon)
                                index += 2;
                        else
                                index += 1;
                }
        }

        return result;
}

unsigned long fw_getenvl(char *envname)
{
        unsigned long envl = 0UL;
        char *str;
        int tmp;

        str = fw_getenv(envname);
        if (str) {
                tmp = kstrtoul(str, 0, &envl);
                if (tmp)
                        envl = 0;
        }

        return envl;
}