Skip to content

Commit

Permalink
MIPS: FW: Add environment variable processing.
Browse files Browse the repository at this point in the history
Add parsing of the environment and command line variables passed to
the kernel to the firmware library.

Signed-off-by: Steven J. Hill <Steven.Hill@imgtec.com>
  • Loading branch information
Steven J. Hill authored and Ralf Baechle committed May 8, 2013
1 parent 98ffcf6 commit 14aecdd
Show file tree
Hide file tree
Showing 3 changed files with 150 additions and 0 deletions.
2 changes: 2 additions & 0 deletions arch/mips/fw/lib/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,6 @@
# Makefile for generic prom monitor library routines under Linux.
#

lib-y += cmdline.o

lib-$(CONFIG_64BIT) += call_o32.o
101 changes: 101 additions & 0 deletions arch/mips/fw/lib/cmdline.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
/*
* 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;

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);
}
}

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

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

if (_fw_envp != 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 + 1) + i);
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;
long val;
int tmp;

str = fw_getenv(envname);
if (str) {
tmp = kstrtol(str, 0, &val);
envl = (unsigned long)val;
}

return envl;
}
47 changes: 47 additions & 0 deletions arch/mips/include/asm/fw/fw.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
/*
* 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.
*/
#ifndef __ASM_FW_H_
#define __ASM_FW_H_

#include <asm/bootinfo.h> /* For cleaner code... */

enum fw_memtypes {
fw_dontuse,
fw_code,
fw_free,
};

typedef struct {
unsigned long base; /* Within KSEG0 */
unsigned int size; /* bytes */
enum fw_memtypes type; /* fw_memtypes */
} fw_memblock_t;

/* Maximum number of memory block descriptors. */
#define FW_MAX_MEMBLOCKS 32

extern int fw_argc;
extern int *_fw_argv;
extern int *_fw_envp;

/*
* Most firmware like YAMON, PMON, etc. pass arguments and environment
* variables as 32-bit pointers. These take care of sign extension.
*/
#define fw_argv(index) ((char *)(long)_fw_argv[(index)])
#define fw_envp(index) ((char *)(long)_fw_envp[(index)])

extern void fw_init_cmdline(void);
extern char *fw_getcmdline(void);
extern fw_memblock_t *fw_getmdesc(void);
extern void fw_meminit(void);
extern char *fw_getenv(char *name);
extern unsigned long fw_getenvl(char *name);
extern void fw_init_early_console(char port);

#endif /* __ASM_FW_H_ */

0 comments on commit 14aecdd

Please sign in to comment.