xref: /kernel/linux/linux-5.10/arch/mips/fw/lib/cmdline.c (revision 8c2ecf20)
18c2ecf20Sopenharmony_ci/*
28c2ecf20Sopenharmony_ci * This file is subject to the terms and conditions of the GNU General Public
38c2ecf20Sopenharmony_ci * License.  See the file "COPYING" in the main directory of this archive
48c2ecf20Sopenharmony_ci * for more details.
58c2ecf20Sopenharmony_ci *
68c2ecf20Sopenharmony_ci * Copyright (C) 2012 MIPS Technologies, Inc.  All rights reserved.
78c2ecf20Sopenharmony_ci */
88c2ecf20Sopenharmony_ci#include <linux/init.h>
98c2ecf20Sopenharmony_ci#include <linux/kernel.h>
108c2ecf20Sopenharmony_ci#include <linux/string.h>
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_ci#include <asm/addrspace.h>
138c2ecf20Sopenharmony_ci#include <asm/fw/fw.h>
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_ciint fw_argc;
168c2ecf20Sopenharmony_ciint *_fw_argv;
178c2ecf20Sopenharmony_ciint *_fw_envp;
188c2ecf20Sopenharmony_ci
198c2ecf20Sopenharmony_ci#ifndef CONFIG_HAVE_PLAT_FW_INIT_CMDLINE
208c2ecf20Sopenharmony_civoid __init fw_init_cmdline(void)
218c2ecf20Sopenharmony_ci{
228c2ecf20Sopenharmony_ci	int i;
238c2ecf20Sopenharmony_ci
248c2ecf20Sopenharmony_ci	/* Validate command line parameters. */
258c2ecf20Sopenharmony_ci	if ((fw_arg0 >= CKSEG0) || (fw_arg1 < CKSEG0)) {
268c2ecf20Sopenharmony_ci		fw_argc = 0;
278c2ecf20Sopenharmony_ci		_fw_argv = NULL;
288c2ecf20Sopenharmony_ci	} else {
298c2ecf20Sopenharmony_ci		fw_argc = (fw_arg0 & 0x0000ffff);
308c2ecf20Sopenharmony_ci		_fw_argv = (int *)fw_arg1;
318c2ecf20Sopenharmony_ci	}
328c2ecf20Sopenharmony_ci
338c2ecf20Sopenharmony_ci	/* Validate environment pointer. */
348c2ecf20Sopenharmony_ci	if (fw_arg2 < CKSEG0)
358c2ecf20Sopenharmony_ci		_fw_envp = NULL;
368c2ecf20Sopenharmony_ci	else
378c2ecf20Sopenharmony_ci		_fw_envp = (int *)fw_arg2;
388c2ecf20Sopenharmony_ci
398c2ecf20Sopenharmony_ci	for (i = 1; i < fw_argc; i++) {
408c2ecf20Sopenharmony_ci		strlcat(arcs_cmdline, fw_argv(i), COMMAND_LINE_SIZE);
418c2ecf20Sopenharmony_ci		if (i < (fw_argc - 1))
428c2ecf20Sopenharmony_ci			strlcat(arcs_cmdline, " ", COMMAND_LINE_SIZE);
438c2ecf20Sopenharmony_ci	}
448c2ecf20Sopenharmony_ci}
458c2ecf20Sopenharmony_ci#endif
468c2ecf20Sopenharmony_ci
478c2ecf20Sopenharmony_cichar * __init fw_getcmdline(void)
488c2ecf20Sopenharmony_ci{
498c2ecf20Sopenharmony_ci	return &(arcs_cmdline[0]);
508c2ecf20Sopenharmony_ci}
518c2ecf20Sopenharmony_ci
528c2ecf20Sopenharmony_cichar *fw_getenv(char *envname)
538c2ecf20Sopenharmony_ci{
548c2ecf20Sopenharmony_ci	char *result = NULL;
558c2ecf20Sopenharmony_ci
568c2ecf20Sopenharmony_ci	if (_fw_envp != NULL && fw_envp(0) != NULL) {
578c2ecf20Sopenharmony_ci		/*
588c2ecf20Sopenharmony_ci		 * Return a pointer to the given environment variable.
598c2ecf20Sopenharmony_ci		 * YAMON uses "name", "value" pairs, while U-Boot uses
608c2ecf20Sopenharmony_ci		 * "name=value".
618c2ecf20Sopenharmony_ci		 */
628c2ecf20Sopenharmony_ci		int i, yamon, index = 0;
638c2ecf20Sopenharmony_ci
648c2ecf20Sopenharmony_ci		yamon = (strchr(fw_envp(index), '=') == NULL);
658c2ecf20Sopenharmony_ci		i = strlen(envname);
668c2ecf20Sopenharmony_ci
678c2ecf20Sopenharmony_ci		while (fw_envp(index)) {
688c2ecf20Sopenharmony_ci			if (strncmp(envname, fw_envp(index), i) == 0) {
698c2ecf20Sopenharmony_ci				if (yamon) {
708c2ecf20Sopenharmony_ci					result = fw_envp(index + 1);
718c2ecf20Sopenharmony_ci					break;
728c2ecf20Sopenharmony_ci				} else if (fw_envp(index)[i] == '=') {
738c2ecf20Sopenharmony_ci					result = fw_envp(index) + i + 1;
748c2ecf20Sopenharmony_ci					break;
758c2ecf20Sopenharmony_ci				}
768c2ecf20Sopenharmony_ci			}
778c2ecf20Sopenharmony_ci
788c2ecf20Sopenharmony_ci			/* Increment array index. */
798c2ecf20Sopenharmony_ci			if (yamon)
808c2ecf20Sopenharmony_ci				index += 2;
818c2ecf20Sopenharmony_ci			else
828c2ecf20Sopenharmony_ci				index += 1;
838c2ecf20Sopenharmony_ci		}
848c2ecf20Sopenharmony_ci	}
858c2ecf20Sopenharmony_ci
868c2ecf20Sopenharmony_ci	return result;
878c2ecf20Sopenharmony_ci}
888c2ecf20Sopenharmony_ci
898c2ecf20Sopenharmony_ciunsigned long fw_getenvl(char *envname)
908c2ecf20Sopenharmony_ci{
918c2ecf20Sopenharmony_ci	unsigned long envl = 0UL;
928c2ecf20Sopenharmony_ci	char *str;
938c2ecf20Sopenharmony_ci	int tmp;
948c2ecf20Sopenharmony_ci
958c2ecf20Sopenharmony_ci	str = fw_getenv(envname);
968c2ecf20Sopenharmony_ci	if (str) {
978c2ecf20Sopenharmony_ci		tmp = kstrtoul(str, 0, &envl);
988c2ecf20Sopenharmony_ci		if (tmp)
998c2ecf20Sopenharmony_ci			envl = 0;
1008c2ecf20Sopenharmony_ci	}
1018c2ecf20Sopenharmony_ci
1028c2ecf20Sopenharmony_ci	return envl;
1038c2ecf20Sopenharmony_ci}
104