^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) * This file is subject to the terms and conditions of the GNU General Public
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * License. See the file "COPYING" in the main directory of this archive
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * for more details.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Copyright (C) 2012 MIPS Technologies, Inc. All rights reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include <linux/init.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <linux/string.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <asm/addrspace.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <asm/fw/fw.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) int fw_argc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) int *_fw_argv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) int *_fw_envp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #ifndef CONFIG_HAVE_PLAT_FW_INIT_CMDLINE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) void __init fw_init_cmdline(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) /* Validate command line parameters. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) if ((fw_arg0 >= CKSEG0) || (fw_arg1 < CKSEG0)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) fw_argc = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) _fw_argv = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) fw_argc = (fw_arg0 & 0x0000ffff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) _fw_argv = (int *)fw_arg1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) /* Validate environment pointer. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) if (fw_arg2 < CKSEG0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) _fw_envp = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) _fw_envp = (int *)fw_arg2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) for (i = 1; i < fw_argc; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) strlcat(arcs_cmdline, fw_argv(i), COMMAND_LINE_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) if (i < (fw_argc - 1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) strlcat(arcs_cmdline, " ", COMMAND_LINE_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) char * __init fw_getcmdline(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) return &(arcs_cmdline[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) char *fw_getenv(char *envname)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) char *result = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) if (_fw_envp != NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) * Return a pointer to the given environment variable.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) * YAMON uses "name", "value" pairs, while U-Boot uses
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) * "name=value".
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) int i, yamon, index = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) yamon = (strchr(fw_envp(index), '=') == NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) i = strlen(envname);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) while (fw_envp(index)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) if (strncmp(envname, fw_envp(index), i) == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) if (yamon) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) result = fw_envp(index + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) } else if (fw_envp(index)[i] == '=') {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) result = fw_envp(index) + i + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) /* Increment array index. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) if (yamon)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) index += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) index += 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) return result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) unsigned long fw_getenvl(char *envname)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) unsigned long envl = 0UL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) char *str;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) int tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) str = fw_getenv(envname);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) if (str) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) tmp = kstrtoul(str, 0, &envl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) if (tmp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) envl = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) return envl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) }