Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags   |
/*
*
* BRIEF MODULE DESCRIPTION
* PROM library initialisation code, supports YAMON and U-Boot.
*
* Copyright 2000-2001, 2006, 2008 MontaVista Software Inc.
* Author: MontaVista Software, Inc. <source@mvista.com>
*
* This file was derived from Carsten Langgaard's
* arch/mips/mips-boards/xx files.
*
* Carsten Langgaard, carstenl@mips.com
* Copyright (C) 1999,2000 MIPS Technologies, Inc. All rights reserved.
*
* 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 SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
* NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/memblock.h>
#include <linux/sizes.h>
#include <linux/string.h>
#include <asm/bootinfo.h>
int prom_argc;
char **prom_argv;
char **prom_envp;
void __init prom_init_cmdline(void)
{
<------>int i;
<------>for (i = 1; i < prom_argc; i++) {
<------><------>strlcat(arcs_cmdline, prom_argv[i], COMMAND_LINE_SIZE);
<------><------>if (i < (prom_argc - 1))
<------><------><------>strlcat(arcs_cmdline, " ", COMMAND_LINE_SIZE);
<------>}
}
char *prom_getenv(char *envname)
{
<------>/*
<------> * Return a pointer to the given environment variable.
<------> * YAMON uses "name", "value" pairs, while U-Boot uses "name=value".
<------> */
<------>char **env = prom_envp;
<------>int i = strlen(envname);
<------>int yamon = (*env && strchr(*env, '=') == NULL);
<------>while (*env) {
<------><------>if (yamon) {
<------><------><------>if (strcmp(envname, *env++) == 0)
<------><------><------><------>return *env;
<------><------>} else if (strncmp(envname, *env, i) == 0 && (*env)[i] == '=')
<------><------><------>return *env + i + 1;
<------><------>env++;
<------>}
<------>return NULL;
}
void __init prom_init(void)
{
<------>unsigned char *memsize_str;
<------>unsigned long memsize;
<------>prom_argc = (int)fw_arg0;
<------>prom_argv = (char **)fw_arg1;
<------>prom_envp = (char **)fw_arg2;
<------>prom_init_cmdline();
<------>memsize_str = prom_getenv("memsize");
<------>if (!memsize_str || kstrtoul(memsize_str, 0, &memsize))
<------><------>memsize = SZ_64M; /* minimum memsize is 64MB RAM */
<------>memblock_add(0, memsize);
}
static inline unsigned char str2hexnum(unsigned char c)
{
<------>if (c >= '0' && c <= '9')
<------><------>return c - '0';
<------>if (c >= 'a' && c <= 'f')
<------><------>return c - 'a' + 10;
<------>if (c >= 'A' && c <= 'F')
<------><------>return c - 'A' + 10;
<------>return 0; /* foo */
}
static inline void str2eaddr(unsigned char *ea, unsigned char *str)
{
<------>int i;
<------>for (i = 0; i < 6; i++) {
<------><------>unsigned char num;
<------><------>if ((*str == '.') || (*str == ':'))
<------><------><------>str++;
<------><------>num = str2hexnum(*str++) << 4;
<------><------>num |= str2hexnum(*str++);
<------><------>ea[i] = num;
<------>}
}
int __init prom_get_ethernet_addr(char *ethernet_addr)
{
<------>char *ethaddr_str;
<------>/* Check the environment variables first */
<------>ethaddr_str = prom_getenv("ethaddr");
<------>if (!ethaddr_str) {
<------><------>/* Check command line */
<------><------>ethaddr_str = strstr(arcs_cmdline, "ethaddr=");
<------><------>if (!ethaddr_str)
<------><------><------>return -1;
<------><------>ethaddr_str += strlen("ethaddr=");
<------>}
<------>str2eaddr(ethernet_addr, ethaddr_str);
<------>return 0;
}
void __init prom_free_prom_memory(void)
{
}