From patchwork Thu Aug 12 23:39:36 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luka Kovacic X-Patchwork-Id: 1516488 X-Patchwork-Delegate: sr@denx.de Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=sartura-hr.20150623.gappssmtp.com header.i=@sartura-hr.20150623.gappssmtp.com header.a=rsa-sha256 header.s=20150623 header.b=EAmtqJVg; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4Gm38x1w3rz9sX5 for ; Fri, 13 Aug 2021 09:40:49 +1000 (AEST) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 91A0982DFA; Fri, 13 Aug 2021 01:40:29 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=sartura.hr Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (2048-bit key; unprotected) header.d=sartura-hr.20150623.gappssmtp.com header.i=@sartura-hr.20150623.gappssmtp.com header.b="EAmtqJVg"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 4FC3B82DC8; Fri, 13 Aug 2021 01:40:19 +0200 (CEST) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=3.4.2 Received: from mail-ej1-x629.google.com (mail-ej1-x629.google.com [IPv6:2a00:1450:4864:20::629]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 5765282DC2 for ; Fri, 13 Aug 2021 01:40:04 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=sartura.hr Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=luka.kovacic@sartura.hr Received: by mail-ej1-x629.google.com with SMTP id d11so14903350eja.8 for ; Thu, 12 Aug 2021 16:40:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sartura-hr.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=eZisi3h0QWIQvJ69p7BJ+tS8CqkTLuiF8MXcmUiJpWs=; b=EAmtqJVgXH1vW3pQ3ZTz+wvJfpBXLsBRtj1Jb+Y7y5dq1WC92756zhlF7HGw8896wP CRpq06GpbLlY6qxxUqzGLLCvnGyjKsjbjyPZTz+Jmp7PY8ob7CYlu1iIFikZbaOOXKyq nZOkbP7TUrzHVUgTVDd+8l+aBUpTmindkiKu4FJhmJ+P2V0AWWjwdyD2AeMACTaL+TzT qO1Up2mGJfVOmD5AtGTvR66MNUGui11ZFepO9Hgzb4dftT3ctQcFkFmdZF8I1ZKRDIFE enJK+qMNytOVGBeZP1H3/VZFlflIcyWDSX8zt+mowfolhnhvmg7aHbyjOMHJ9pX3MnBG qD3A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=eZisi3h0QWIQvJ69p7BJ+tS8CqkTLuiF8MXcmUiJpWs=; b=swXAAWiWh3eDT5ninICjsrBsD1HquKtBnKJ/mxGKpBu9J/Ve3F+AURCudMVDxBFBHx Fso+jSJbdu3JFh1/LL56MJNTtTbqC/s+GellKi0Ls60Iqz1DSPsZm//o3oYgZXmky2cH 1ZI4N0NAIgWRgvaxQuEGnkMPhjyeT7Bp4dlcGbsZUSDfDTMKeBxr3HDL/x2w+VYIcjHY HxyuqI3Z1wV+DUmuYzd4iz11dQQa+0GQzk8TNMOQLZJ00mMe7qtbQ0wIDCpFm1x2Tbeo vwsR67vj105jPgwJR2iji1gyf/ZtPoKkgGqpV6nNCrtReA7Tk5mJA4+6ss2CtKgv8WuQ CL4A== X-Gm-Message-State: AOAM532ockVATB21XoGsuGJFqcfWj/srSkxf90WfQCodg4zXepVIFl6Z 4m123LkjxRlMEUPras2mlku6urfXwMQF7UmMzHk1H737PMu1LPkt4LuzUOJ2wB0DNHLpe0Q6nlx g/jpp0TsQ/yBy87OKLscxUcs53JwgIS6oCj4kuZNz6LwTKrb5vZJDp49PmnDrw/B/vh5SFkQx X-Google-Smtp-Source: ABdhPJxAHeRYPMPhLpDmsU7WzZ65Mxgy2ToPBeskk1e/2pY5o4550grMp9QnpXNYhTZs9IJpQSSMbg== X-Received: by 2002:a17:906:d7af:: with SMTP id pk15mr6028319ejb.51.1628811603309; Thu, 12 Aug 2021 16:40:03 -0700 (PDT) Received: from localhost.localdomain ([2a00:ee2:4b0d:3001:fbc5:498b:ed6d:cfac]) by smtp.gmail.com with ESMTPSA id t15sm1325800ejf.119.2021.08.12.16.40.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 12 Aug 2021 16:40:02 -0700 (PDT) From: Luka Kovacic To: u-boot@lists.denx.de Cc: robert.marko@sartura.hr, luka.perkov@sartura.hr, marek.behun@nic.cz, pali@kernel.org, sr@denx.de, sjg@chromium.org, patrick.delaunay@foss.st.com, xypron.glpk@gmx.de, Luka Kovacic Subject: [PATCH v3 1/3] arm: mvebu: mvebu_armada-37xx: Implement the mac command (Marvell hw_info) Date: Fri, 13 Aug 2021 01:39:36 +0200 Message-Id: <20210812233938.11633-2-luka.kovacic@sartura.hr> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210812233938.11633-1-luka.kovacic@sartura.hr> References: <20210812233938.11633-1-luka.kovacic@sartura.hr> MIME-Version: 1.0 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.103.2 at phobos.denx.de X-Virus-Status: Clean The mac command is implemented to enable parsing Marvell hw_info formatted environments. This format is often used on Marvell Armada A37XX based devices to store parameters like the board serial number, factory MAC addresses and some other information. These parameters are usually written to the flash in the factory. Currently the mac command supports reading/writing parameters and dumping the current hw_info parameters. EEPROM config pattern and checksum aren't supported. This functionality has been tested on the GST ESPRESSOBin-Ultra board successfully, both reading the stock U-Boot parameters in mainline U-Boot and reading the parameters written by this command in the stock U-Boot. Usage example: => mac read => saveenv Signed-off-by: Luka Kovacic Cc: Luka Perkov Cc: Robert Marko --- arch/arm/mach-mvebu/Kconfig | 1 + board/Marvell/mvebu_armada-37xx/Kconfig | 29 ++ board/Marvell/mvebu_armada-37xx/Makefile | 3 +- board/Marvell/mvebu_armada-37xx/mac/Makefile | 5 + board/Marvell/mvebu_armada-37xx/mac/hw_info.c | 391 ++++++++++++++++++ include/configs/mvebu_armada-37xx.h | 7 + lib/hashtable.c | 2 +- 7 files changed, 436 insertions(+), 2 deletions(-) create mode 100644 board/Marvell/mvebu_armada-37xx/Kconfig create mode 100644 board/Marvell/mvebu_armada-37xx/mac/Makefile create mode 100644 board/Marvell/mvebu_armada-37xx/mac/hw_info.c diff --git a/arch/arm/mach-mvebu/Kconfig b/arch/arm/mach-mvebu/Kconfig index 89737a37ad..dff9f05b28 100644 --- a/arch/arm/mach-mvebu/Kconfig +++ b/arch/arm/mach-mvebu/Kconfig @@ -312,6 +312,7 @@ config SECURED_MODE_CSK_INDEX default 0 depends on SECURED_MODE_IMAGE +source "board/Marvell/mvebu_armada-37xx/Kconfig" source "board/solidrun/clearfog/Kconfig" source "board/kobol/helios4/Kconfig" diff --git a/board/Marvell/mvebu_armada-37xx/Kconfig b/board/Marvell/mvebu_armada-37xx/Kconfig new file mode 100644 index 0000000000..b84dd20023 --- /dev/null +++ b/board/Marvell/mvebu_armada-37xx/Kconfig @@ -0,0 +1,29 @@ +menu "Marvell Armada 37xx configuration" +depends on TARGET_MVEBU_ARMADA_37XX + +config MVEBU_MAC_HW_INFO + bool "Marvell hw_info (mac) support" + depends on SPI_FLASH && ENV_IS_IN_SPI_FLASH && ARCH_MVEBU + default n + help + Enable loading of the Marvell hw_info parameters from the + SPI flash hw_info area. Parameters (usually the board serial + number and MAC addresses) are then imported into the + existing U-Boot environment. + Implementation of this command is compatible with the + original Marvell U-Boot command. Reading and writing is + supported. + EEPROM config pattern and checksum aren't supported. + After enabled, these parameters are managed from the common + U-Boot mac command. + +config MVEBU_MAC_HW_INFO_OFFSET + hex "Marvell hw_info (mac) SPI flash offset" + depends on MVEBU_MAC_HW_INFO + default 0x3E0000 + help + This option defines the SPI flash offset of the Marvell + hw_info area. This defaults to 0x3E0000 on most Armada + A3720 platforms. + +endmenu diff --git a/board/Marvell/mvebu_armada-37xx/Makefile b/board/Marvell/mvebu_armada-37xx/Makefile index 27221557c7..6f6ac6b193 100644 --- a/board/Marvell/mvebu_armada-37xx/Makefile +++ b/board/Marvell/mvebu_armada-37xx/Makefile @@ -2,4 +2,5 @@ # # Copyright (C) 2016 Stefan Roese -obj-y := board.o +obj-y += board.o +obj-y += mac/ diff --git a/board/Marvell/mvebu_armada-37xx/mac/Makefile b/board/Marvell/mvebu_armada-37xx/mac/Makefile new file mode 100644 index 0000000000..7c30fe6194 --- /dev/null +++ b/board/Marvell/mvebu_armada-37xx/mac/Makefile @@ -0,0 +1,5 @@ +# SPDX-License-Identifier: GPL-2.0+ +# +# Copyright (c) 2021 Sartura Ltd. + +obj-$(CONFIG_ID_EEPROM) += hw_info.o diff --git a/board/Marvell/mvebu_armada-37xx/mac/hw_info.c b/board/Marvell/mvebu_armada-37xx/mac/hw_info.c new file mode 100644 index 0000000000..91e5cd8dcf --- /dev/null +++ b/board/Marvell/mvebu_armada-37xx/mac/hw_info.c @@ -0,0 +1,391 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Marvell hw_info (mac) command implementation + * Helper command for interfacing with the Marvell hw_info parameters + * + * Copyright (c) 2021 Sartura Ltd. + * Copyright (c) 2018 Marvell International Ltd. + * + * Author: Luka Kovacic + */ + +#include +#include +#include +#include +#include +#include + +#define HW_INFO_SPI_FLASH_OFFSET CONFIG_MVEBU_MAC_HW_INFO_OFFSET + +#define HW_INFO_MAX_ENV_SIZE 0x1F0 +#define HW_INFO_ENV_OFFSET 0xA +#define HW_INFO_ENV_SEP 0x20 + +#define HW_INFO_MAX_NAME_LEN 32 + +#define HW_INFO_MERGED_VARIABLE "read_board_hw_info" + +static char hw_info_allowed_parameters[][HW_INFO_MAX_NAME_LEN] = { + "pcb_slm", + "pcb_rev", + "eco_rev", + "pcb_sn", + "ethaddr", + "eth1addr", + "eth2addr", + "eth3addr", + "eth4addr", + "eth5addr", + "eth6addr", + "eth7addr", + "eth8addr", + "eth9addr", +}; + +static int hw_info_allowed_param_count = (sizeof(hw_info_allowed_parameters) / + sizeof(hw_info_allowed_parameters[0])); + +static int hw_info_check_parameter(char *name) +{ + int idx; + + for (idx = 0; idx < hw_info_allowed_param_count; idx++) { + if (strcmp(name, hw_info_allowed_parameters[idx]) == 0) + return 0; + } + + return -EINVAL; +} + +/** + * read_spi_flash_offset() - Read data from the SPI flash + * @buf: Buffer to write in + * @offset: Offset from the flash start + * + * Read SPI flash data into the buffer from offset to HW_INFO_MAX_ENV_SIZE. + */ +static int read_spi_flash_offset(char *buf, int offset) +{ + struct spi_flash *flash; + int ret; + + flash = spi_flash_probe(CONFIG_SF_DEFAULT_BUS, + CONFIG_SF_DEFAULT_CS, + CONFIG_SF_DEFAULT_SPEED, + CONFIG_SF_DEFAULT_MODE); + + if (!flash) { + printf("Error - unable to probe SPI flash.\n"); + return -EIO; + } + + ret = spi_flash_read(flash, offset, HW_INFO_MAX_ENV_SIZE, buf); + if (ret) { + printf("Error - unable to read hw_info environment from SPI flash.\n"); + return ret; + } + + return ret; +} + +/** + * write_spi_flash_offset() - Write a buffer to SPI flash + * @buf: Buffer to write to SPI flash + * @offset: Offset from the flash start + * @size: Size of the buffer content + * + * This function probes the SPI flash and updates the specified flash location + * with new data from the buffer. + */ +static int write_spi_flash_offset(char *buf, int offset, ssize_t size) +{ + ssize_t safe_size, erase_size; + struct spi_flash *flash; + int ret; + + flash = spi_flash_probe(CONFIG_SF_DEFAULT_BUS, + CONFIG_SF_DEFAULT_CS, + CONFIG_SF_DEFAULT_SPEED, + CONFIG_SF_DEFAULT_MODE); + + if (!flash) { + printf("Error - unable to probe SPI flash.\n"); + return -EIO; + } + + safe_size = size > HW_INFO_MAX_ENV_SIZE ? HW_INFO_MAX_ENV_SIZE : size; + erase_size = safe_size + + (flash->erase_size - safe_size % flash->erase_size); + ret = spi_flash_erase(flash, HW_INFO_SPI_FLASH_OFFSET, erase_size); + if (ret) { + printf("Error - unable to erase the hw_info area on SPI flash.\n"); + return ret; + } + ret = spi_flash_write(flash, offset, safe_size, buf); + if (ret) { + printf("Error - unable to write hw_info parameters to SPI flash.\n"); + return ret; + } + + return ret; +} + +/** + * cmd_hw_info_dump() - Dump the hw_info parameters + * + * This function prints all Marvell hw_info parameters, which are stored in + * the SPI flash. + */ +static int cmd_hw_info_dump(void) +{ + char buffer[HW_INFO_MAX_ENV_SIZE]; + struct hsearch_data htab; + char *res = NULL; + ssize_t len; + int ret = 0; + + ret = read_spi_flash_offset(buffer, HW_INFO_SPI_FLASH_OFFSET + + HW_INFO_ENV_OFFSET); + if (ret) + goto err; + memset(&htab, 0, sizeof(htab)); + if (!hcreate_r(HW_INFO_MAX_ENV_SIZE, &htab)) { + ret = -ENOMEM; + goto err; + } + if (!himport_r(&htab, buffer, HW_INFO_MAX_ENV_SIZE, + HW_INFO_ENV_SEP, H_NOCLEAR, 0, 0, NULL)) { + ret = -EFAULT; + goto err_htab; + } + + len = hexport_r(&htab, '\n', H_HIDE_DOT, &res, 0, 0, NULL); + if (len > 0) { + printf("Parameters (hw_info):\n"); + puts(res); + free(res); + ret = 0; + goto ret_htab; + } +ret_htab: + hdestroy_r(&htab); + return ret; +err_htab: + hdestroy_r(&htab); +err: + printf("## Error: cannot store hw_info parameters to SPI flash\n"); + return ret; +} + +/** + * cmd_hw_info_read() - Import the hw_info parameters into U-Boot env + * @print_env: Print U-Boot environment after new parameters are imported + * + * This function reads the Marvell hw_info parameters from SPI flash and + * imports them into the U-Boot env. + */ +static int cmd_hw_info_read(bool print_env) +{ + char buffer[HW_INFO_MAX_ENV_SIZE]; + char *res = NULL; + ssize_t len; + int ret = 0; + + ret = read_spi_flash_offset(buffer, HW_INFO_SPI_FLASH_OFFSET + + HW_INFO_ENV_OFFSET); + if (ret) + goto err; + if (!himport_r(&env_htab, buffer, HW_INFO_MAX_ENV_SIZE, + HW_INFO_ENV_SEP, H_NOCLEAR, 0, 0, NULL)) { + ret = -EFAULT; + goto err; + } + + printf("Successfully imported the Marvell hw_info parameters.\n"); + if (!print_env) + return 0; + + len = hexport_r(&env_htab, '\n', H_HIDE_DOT, &res, 0, 0, NULL); + if (len > 0) { + printf("Updated environment:\n"); + puts(res); + free(res); + return 0; + } +err: + printf("## Error: cannot import hw_info parameters\n"); + return ret; +} + +/** + * cmd_hw_info_save() - Save a parameter from U-Boot env to hw_info parameters + * @name: Name of the U-Boot env parameter to save + * + * This function finds the specified parameter by name in the U-Boot env + * and then updates the Marvell hw_info parameters with the new value. + */ +static int cmd_hw_info_save(char *name) +{ + char buffer[HW_INFO_MAX_ENV_SIZE]; + struct env_entry e, *ep, *rv; + struct hsearch_data htab; + char *res = NULL; + ssize_t len; + int ret = 0; + + ret = hw_info_check_parameter(name); + if (ret) { + printf("Invalid parameter %s, stopping.\n", name); + goto err; + } + + ret = read_spi_flash_offset(buffer, HW_INFO_SPI_FLASH_OFFSET + + HW_INFO_ENV_OFFSET); + if (ret) + goto err; + memset(&htab, 0, sizeof(htab)); + if (!hcreate_r(HW_INFO_MAX_ENV_SIZE, &htab)) { + ret = -ENOMEM; + goto err; + } + if (!himport_r(&htab, buffer, HW_INFO_MAX_ENV_SIZE, + HW_INFO_ENV_SEP, H_NOCLEAR, 0, 0, NULL)) { + ret = -EFAULT; + goto err_htab; + } + + e.key = name; + e.data = NULL; + if (!hsearch_r(e, ENV_FIND, &ep, &env_htab, H_HIDE_DOT)) { + ret = -ENOENT; + goto err_htab; + } + if (!ep) { + ret = -ENOENT; + goto err_htab; + } + + printf("Storing %s=%s to hw_info...\n", ep->key, ep->data); + + e.key = ep->key; + e.data = ep->data; + if (!hsearch_r(e, ENV_ENTER, &rv, &htab, H_HIDE_DOT)) { + ret = -EINVAL; + goto err_htab; + } + if (!rv) { + ret = -EINVAL; + goto err_htab; + } + len = hexport_r(&htab, HW_INFO_ENV_SEP, H_MATCH_KEY | H_MATCH_IDENT, + &res, 0, 0, NULL); + if (len <= 0) { + free(res); + goto ret_htab; + } + ret = write_spi_flash_offset(res, HW_INFO_SPI_FLASH_OFFSET + + HW_INFO_ENV_OFFSET, len); + free(res); + if (ret) + goto err_htab; + + printf("Successfully stored the Marvell hw_info parameters.\n"); + return 0; +ret_htab: + hdestroy_r(&htab); + return ret; +err_htab: + hdestroy_r(&htab); +err: + printf("## Error: cannot store hw_info parameters to SPI flash\n"); + return ret; +} + +/** + * mac_read_from_eeprom() - Read the parameters from SPI flash. + * + * This function reads the content of the Marvell hw_info parameters from the + * SPI flash and imports them into the U-Boot environment. + * This includes MAC addresses and board serial numbers. + * + * The import is performed only once. + * + * This function is a part of the U-Boot mac command and must be executed + * after SPI flash initialization. + */ +int mac_read_from_eeprom(void) +{ + if (env_get_ulong(HW_INFO_MERGED_VARIABLE, 10, 0) == 0) { + if (env_set_ulong(HW_INFO_MERGED_VARIABLE, 1)) + return -ENOENT; + return cmd_hw_info_read(false); + } + return 0; +} + +/** + * print_platform_help() - Print the platform specific help + * + * Extend the existing U-Boot mac command description by also printing + * platform specific help text. + */ +static void print_platform_help(void) +{ + printf("\nNote: arguments mac [id|num|errata|date|ports|port_number]\n" + "are unavailable on Marvell Armada A37xx platforms.\n" + "Use mac [read|save {parameter}] instead.\n" + "Available parameters:\n" + "pcb_slm\tPCB SLM number\n" + "pcb_rev\tPCB revision number\n" + "eco_rev\tECO revision number\n" + "pcb_sn\tPCB SN\n" + "ethaddr\tfirst MAC address\n" + "eth[1-9]addr\tsecond-ninth MAC address\n"); +} + +/** + * do_mac() - Standard U-Boot mac command implementation + * @cmdtp: U-Boot command table + * @flag: Execution flags + * @argc: Count of arguments + * @argv: Arguments + * + * This function implements the standard U-Boot mac command in a mostly + * compatible way. + * To conform to the general command structure as much as possible, the + * command description from cmd/mac.c is followed. + * Where not possible, convenient or sensible additional comments for the user + * are added. + */ +int do_mac(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) +{ + const char *cmd = argv[1]; + int ret = 0; + + if (argc == 1) { + ret = cmd_hw_info_dump(); + if (ret) + return -EINVAL; + return CMD_RET_SUCCESS; + } + + if (!strcmp(cmd, "read")) { + if (cmd_hw_info_read(true)) + return -EINVAL; + } else if (!strcmp(cmd, "save")) { + if (argc != 3) { + printf("Please pass an additional argument to specify, " + "which env parameter to save.\n"); + return -EINVAL; + } + if (cmd_hw_info_save(argv[2])) + return -EINVAL; + } else { + ret = cmd_usage(cmdtp); + print_platform_help(); + return ret; + } + + return CMD_RET_SUCCESS; +} diff --git a/include/configs/mvebu_armada-37xx.h b/include/configs/mvebu_armada-37xx.h index c8c34d7d92..8e8bcfa018 100644 --- a/include/configs/mvebu_armada-37xx.h +++ b/include/configs/mvebu_armada-37xx.h @@ -62,6 +62,13 @@ */ #define DEFAULT_ENV_IS_RW /* required for configuring default fdtfile= */ +/* + * Platform identification (Marvell hw_info parameters) + */ +#ifdef CONFIG_MVEBU_MAC_HW_INFO +#define CONFIG_ID_EEPROM /* U-Boot mac command */ +#endif + /* * Ethernet Driver configuration */ diff --git a/lib/hashtable.c b/lib/hashtable.c index ff5ff72639..06322e3304 100644 --- a/lib/hashtable.c +++ b/lib/hashtable.c @@ -794,7 +794,7 @@ static int drop_var_from_set(const char *name, int nvars, char * vars[]) * multi-line values. * * In theory, arbitrary separator characters can be used, but only - * '\0' and '\n' have really been tested. + * '\0', '\n' and 0x20 have been tested. */ int himport_r(struct hsearch_data *htab, From patchwork Thu Aug 12 23:39:37 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luka Kovacic X-Patchwork-Id: 1516487 X-Patchwork-Delegate: sr@denx.de Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=sartura-hr.20150623.gappssmtp.com header.i=@sartura-hr.20150623.gappssmtp.com header.a=rsa-sha256 header.s=20150623 header.b=UIV9HCv9; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4Gm38W5nnyz9t2b for ; Fri, 13 Aug 2021 09:40:27 +1000 (AEST) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 9076282DCE; Fri, 13 Aug 2021 01:40:20 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=sartura.hr Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (2048-bit key; unprotected) header.d=sartura-hr.20150623.gappssmtp.com header.i=@sartura-hr.20150623.gappssmtp.com header.b="UIV9HCv9"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 0EA3582DF0; Fri, 13 Aug 2021 01:40:16 +0200 (CEST) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,SPF_HELO_NONE autolearn=ham autolearn_force=no version=3.4.2 Received: from mail-ed1-x52b.google.com (mail-ed1-x52b.google.com [IPv6:2a00:1450:4864:20::52b]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 0BBDC82DCE for ; Fri, 13 Aug 2021 01:40:05 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=sartura.hr Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=luka.kovacic@sartura.hr Received: by mail-ed1-x52b.google.com with SMTP id g21so12520893edb.4 for ; Thu, 12 Aug 2021 16:40:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sartura-hr.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=GSGpamJXjHpPCJoZ+uIFDf4+6WjTOkJv/1+mWjkaq14=; b=UIV9HCv9UdajQ6356sKoM8tELyKDdrqWPq3vLN3FdqiHvKXh7QO20F2Uq0LSPdq03i CnkOTJfsoXg0CLe6kY26qNT3ROo84LE/fTcFV+ahGFvKUSs/w0FlDbv417HdXxt7ur/3 pK2DPlAdP2sT8GubKtDd6/QmG0fWqzY6HLZSioe6xRcOQjWmQSnqHzco6RbJ0mv5C9Ue GlSrrNXXS5sR9hR7EsySnwJ5fuztOWxCBxkMmNV8+YUgZZ0tHNgJ9gUVfJz9A8/0Z+qa U/a3K4i+zka3pMjv2EbRGyRrSHArxiplMsnl9tcQOb7uKr3yioorNlQpECq1TmsceMwF 1ciw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=GSGpamJXjHpPCJoZ+uIFDf4+6WjTOkJv/1+mWjkaq14=; b=noBFsf923/A7g1pa2NQ3gTYeYZ4yOwbzaZ7FkUYsHsoxofH3vzeDEBVNjbovTHJq9M pb4nnA8i2/xAF6t/fwiuoQHy2vsfhfXjEyQOH4RG0MzHi4WBHMAaWIYZvbrznzX2xhcW GvM1wwlqro1nVTnkZLXhIBVIq7PNF38lbDFUqTEBl9IVm8K5dRq7ktuouNfuV0hnUV+c eqXsICWHLcMsbu229aoDDB/Wtfnmi/GiBJu7sPdKF0TsoDm60Pf/CQ+LoTwiAggmPCHI 3DQ1w0l6hgzApcAAzvBt9gxzSRvsvGV6GvFoMBpAwZmWJExmbp/Aaigi8gOf7ewmuyHK pr6g== X-Gm-Message-State: AOAM530QR4FbFhS346GLSaAE3+8tRcteKNTi4DWTWtTrKUjf69bat1qW RK707eih7DqcJzD6jPs8jFZemmzOPNa5qX9dYlbGfYwLHBXCp07wJIzUm0Crea8JU705t2JLtQE 17xAxLoNfCCJRowI4BCQFrmd9Lh7AeYlM6bfRR54IOrFK0Be0BcTlqv6hxtEeSWPyPLcjhCZx X-Google-Smtp-Source: ABdhPJxyhptZToeYNF+j7NbFmC6WdVnS81EgUIB/m/fSMalvMjVgYK+P24BVhvgn5/Y4YSIYp/7g2Q== X-Received: by 2002:aa7:d40e:: with SMTP id z14mr8777163edq.250.1628811604405; Thu, 12 Aug 2021 16:40:04 -0700 (PDT) Received: from localhost.localdomain ([2a00:ee2:4b0d:3001:fbc5:498b:ed6d:cfac]) by smtp.gmail.com with ESMTPSA id t15sm1325800ejf.119.2021.08.12.16.40.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 12 Aug 2021 16:40:04 -0700 (PDT) From: Luka Kovacic To: u-boot@lists.denx.de Cc: robert.marko@sartura.hr, luka.perkov@sartura.hr, marek.behun@nic.cz, pali@kernel.org, sr@denx.de, sjg@chromium.org, patrick.delaunay@foss.st.com, xypron.glpk@gmx.de, Luka Kovacic Subject: [PATCH v3 2/3] arm: mvebu: mvebu_armada-37xx: Define the loadaddr environment variable Date: Fri, 13 Aug 2021 01:39:37 +0200 Message-Id: <20210812233938.11633-3-luka.kovacic@sartura.hr> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210812233938.11633-1-luka.kovacic@sartura.hr> References: <20210812233938.11633-1-luka.kovacic@sartura.hr> MIME-Version: 1.0 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.103.2 at phobos.denx.de X-Virus-Status: Clean Add the loadaddr U-Boot environment variable, as this is available in the stock Marvell U-Boot by default on Marvell Armada A37XX platforms. Signed-off-by: Luka Kovacic Cc: Luka Perkov Cc: Robert Marko --- include/configs/mvebu_armada-37xx.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/configs/mvebu_armada-37xx.h b/include/configs/mvebu_armada-37xx.h index 8e8bcfa018..6901680e32 100644 --- a/include/configs/mvebu_armada-37xx.h +++ b/include/configs/mvebu_armada-37xx.h @@ -110,6 +110,7 @@ /* fdt_addr and kernel_addr are needed for existing distribution boot scripts */ #define CONFIG_EXTRA_ENV_SETTINGS \ + "loadaddr=0x6000000\0" \ "scriptaddr=0x6d00000\0" \ "pxefile_addr_r=0x6e00000\0" \ "fdt_addr=0x6f00000\0" \ From patchwork Thu Aug 12 23:39:38 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luka Kovacic X-Patchwork-Id: 1516489 X-Patchwork-Delegate: sr@denx.de Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=85.214.62.61; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=sartura-hr.20150623.gappssmtp.com header.i=@sartura-hr.20150623.gappssmtp.com header.a=rsa-sha256 header.s=20150623 header.b=jW+Chjhg; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4Gm39836cNz9sX5 for ; Fri, 13 Aug 2021 09:41:00 +1000 (AEST) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id C8E2582E0D; Fri, 13 Aug 2021 01:40:32 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=sartura.hr Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (2048-bit key; unprotected) header.d=sartura-hr.20150623.gappssmtp.com header.i=@sartura-hr.20150623.gappssmtp.com header.b="jW+Chjhg"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 6461882E7A; Fri, 13 Aug 2021 01:40:25 +0200 (CEST) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=3.4.2 Received: from mail-ed1-x52f.google.com (mail-ed1-x52f.google.com [IPv6:2a00:1450:4864:20::52f]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 9A0C882DD5 for ; Fri, 13 Aug 2021 01:40:06 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=sartura.hr Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=luka.kovacic@sartura.hr Received: by mail-ed1-x52f.google.com with SMTP id z11so12458087edb.11 for ; Thu, 12 Aug 2021 16:40:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sartura-hr.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=6zm6yYzFAnEDfw9d7QOSnYcasTZoeu8FkeDHX1gRf84=; b=jW+Chjhg9I/PL+clrQpEbUV4Ruv00rvwvNFoB4N64Z+cPzRLrUjBrkkAXR/PItavLb 6p8o6qhTjwDthXfpIweg0/W95dEzs9XCpUJ224XvX8Irxzeuio9g6OKacrQeI1+ya2PV Vcjj7mjoiIPhngS9+g3UOn++fP6Eat5CvBRdpKwKJETVVI6Wy7LAmUV2Cc+mX5mns5Jy KaONTne9UBc+9mqXj2cW8d7d+omVF7snIyC3ozbzowDWXV2/aT8H/xVVOI/9qOCYSEr+ gHzN/58wGMOPh3SO9jVBxQdYjHdDjByONClzm0xhJ1/xUFd1kwUscEdDZ7EN+0x3bbVb nc5A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=6zm6yYzFAnEDfw9d7QOSnYcasTZoeu8FkeDHX1gRf84=; b=dgwmJbmWyIT/GJtheoHMk6pR8ofH4gH2eWdMXraE45ql2IBtmfnKdYisTj4Vtkdf/G XyPjUJmdED36FbWMTV7fn/+NQkKydt+9PLZ8IzPlWK5FMfjk1cH0F2lrIcj2jooJ7zWf wTC+bKxf3RC0TOuJUNSOhSKUFZQU4uqyVPCNGvIfpziKIjhPTpiEO//3HE1jZx5c0U71 TbEI3+jt8YOUZr30RV4CWfLhDxNM2CLIyaxEd0GW2BFLro6JqkEsLjYUZmzuWQa8nbQG fc5ZNwrsvoIcMdtU8DBqzBExGmO15anIxQVYxhAergWG0Vvg7x1HEKmP0NVXxj/IPMf4 8b5g== X-Gm-Message-State: AOAM530HmYaB58u3+MOjVuIejxL8Zr4PzGeWfpptVy3r6eL3rGOjLlbM m1HOx2x0WtnXGLs45BZPcAhYK5Q37g/8Tb09Z96XMuFe2t5GNrJiLJs1tIHK7EakSzJhDPPZjHF PFzlpPGAntDOBWQMQ7C0EPx8jmmdScpR5Vw8ZC9YsRVt1B2jS5pMXFqyF/ADBzoqGIRA1Jn/l X-Google-Smtp-Source: ABdhPJwvbI3LIhO8ZVhjAaAg7me82LN2el8J5DC885zE92tX1+fTG64Th+ZCRgegfR+W9LmIpk8sgA== X-Received: by 2002:aa7:d05a:: with SMTP id n26mr4903434edo.272.1628811605732; Thu, 12 Aug 2021 16:40:05 -0700 (PDT) Received: from localhost.localdomain ([2a00:ee2:4b0d:3001:fbc5:498b:ed6d:cfac]) by smtp.gmail.com with ESMTPSA id t15sm1325800ejf.119.2021.08.12.16.40.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 12 Aug 2021 16:40:05 -0700 (PDT) From: Luka Kovacic To: u-boot@lists.denx.de Cc: robert.marko@sartura.hr, luka.perkov@sartura.hr, marek.behun@nic.cz, pali@kernel.org, sr@denx.de, sjg@chromium.org, patrick.delaunay@foss.st.com, xypron.glpk@gmx.de, Luka Kovacic Subject: [PATCH v3 3/3] arm: mvebu: Initial ESPRESSOBin-Ultra board support Date: Fri, 13 Aug 2021 01:39:38 +0200 Message-Id: <20210812233938.11633-4-luka.kovacic@sartura.hr> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210812233938.11633-1-luka.kovacic@sartura.hr> References: <20210812233938.11633-1-luka.kovacic@sartura.hr> MIME-Version: 1.0 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.103.2 at phobos.denx.de X-Virus-Status: Clean Add initial support for the ESPRESSOBin-Ultra board from Globalscale Technologies, Inc. The board is based on the 64-bit dual-core Marvell Armada 3720 SoC. Peripherals: - 5 Gigabit Ethernet ports (WAN has PoE, up to 30W, Topaz 6341 switch) - RTC clock (PCF8563) - USB 3.0 port - USB 2.0 port - 4x LED - UART over Micro-USB - M.2 slot (2280) - Mini PCI-E slot Additionally, automatic import of the Marvell hw_info parameters is enabled via the recently added mac command for A37XX platforms. The parameters stored in Marvell hw_info are usually the board serial number and MAC addresses. Signed-off-by: Luka Kovacic Cc: Luka Perkov Cc: Robert Marko --- arch/arm/dts/Makefile | 1 + .../arm/dts/armada-3720-espressobin-ultra.dts | 114 ++++++++++ arch/arm/dts/armada-3720-espressobin.dts | 199 +---------------- arch/arm/dts/armada-3720-espressobin.dtsi | 210 ++++++++++++++++++ board/Marvell/mvebu_armada-37xx/MAINTAINERS | 8 + board/Marvell/mvebu_armada-37xx/board.c | 92 +++++++- .../mvebu_espressobin-ultra-88f3720_defconfig | 93 ++++++++ 7 files changed, 514 insertions(+), 203 deletions(-) create mode 100644 arch/arm/dts/armada-3720-espressobin-ultra.dts create mode 100644 arch/arm/dts/armada-3720-espressobin.dtsi create mode 100644 configs/mvebu_espressobin-ultra-88f3720_defconfig diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile index c42715ead4..f21c9c94d3 100644 --- a/arch/arm/dts/Makefile +++ b/arch/arm/dts/Makefile @@ -213,6 +213,7 @@ dtb-$(CONFIG_ARCH_TEGRA) += tegra20-harmony.dtb \ dtb-$(CONFIG_ARCH_MVEBU) += \ armada-3720-db.dtb \ armada-3720-espressobin.dtb \ + armada-3720-espressobin-ultra.dtb \ armada-3720-turris-mox.dtb \ armada-3720-uDPU.dtb \ armada-375-db.dtb \ diff --git a/arch/arm/dts/armada-3720-espressobin-ultra.dts b/arch/arm/dts/armada-3720-espressobin-ultra.dts new file mode 100644 index 0000000000..5ad0c723e3 --- /dev/null +++ b/arch/arm/dts/armada-3720-espressobin-ultra.dts @@ -0,0 +1,114 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Device Tree file for ESPRESSObin-Ultra board + * Copyright (C) 2016 Marvell + * Copyright (C) 2019 Globalscale technologies, Inc. + * Copyright (C) 2021 Sartura Ltd. + * + * Author: Jason Hung + * Author: Luka Kovacic + * Author: Vladimir Vid + */ + +/dts-v1/; + +#include "armada-3720-espressobin.dtsi" + +/ { + model = "Globalscale Marvell ESPRESSOBin Ultra Board"; + compatible = "globalscale,espressobin-ultra", "marvell,armada3720", "marvell,armada3710"; + + gpio-leds { + pinctrl-names = "default"; + pinctrl-0 = <&led1_pins>, <&led2_pins>, <&led3_pins>, <&led4_pins>; + compatible = "gpio-leds"; + + led1 { + label = "led1"; + gpios = <&gpionb 11 GPIO_ACTIVE_LOW>; + default-state = "on"; + }; + led2 { + label = "led2"; + gpios = <&gpionb 12 GPIO_ACTIVE_LOW>; + default-state = "on"; + }; + led3 { + label = "led3"; + gpios = <&gpionb 13 GPIO_ACTIVE_LOW>; + default-state = "on"; + }; + led4 { + label = "led4"; + gpios = <&gpionb 14 GPIO_ACTIVE_LOW>; + default-state = "on"; + }; + }; +}; + +&pinctrl_nb { + led1_pins: led1-pins { + groups = "pwm0"; + function = "gpio"; + }; + led2_pins: led2-pins { + groups = "pwm1"; + function = "gpio"; + }; + led3_pins: led3-pins { + groups = "pwm2"; + function = "gpio"; + }; + led4_pins: led4-pins { + groups = "pwm3"; + function = "gpio"; + }; +}; + +ð0 { + status = "okay"; + phy_addr = <0x3>; +}; + +&i2c0 { + status = "okay"; + #address-cells = <1>; + #size-cells = <0>; + rtc@51 { + compatible = "nxp,pcf8563"; + reg = <0x51>; + }; +}; + +&sata { + status = "okay"; +}; + +&sdhci0 { + status = "disabled"; +}; + +&sdhci1 { + status = "okay"; +}; + +&spi0 { + status = "okay"; +}; + +/* Exported on the micro USB connector through an FTDI */ +&uart0 { + status = "okay"; +}; + +&usb2 { + status = "okay"; +}; + +&usb3 { + status = "okay"; +}; + +&pcie0 { + status = "okay"; +}; diff --git a/arch/arm/dts/armada-3720-espressobin.dts b/arch/arm/dts/armada-3720-espressobin.dts index cba6139be6..925ce6a38e 100644 --- a/arch/arm/dts/armada-3720-espressobin.dts +++ b/arch/arm/dts/armada-3720-espressobin.dts @@ -1,210 +1,15 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) /* * Device Tree file for Marvell Armada 3720 community board * (ESPRESSOBin) * Copyright (C) 2016 Marvell - * - * Gregory CLEMENT - * Konstantin Porotchkin - * - * This file is dual-licensed: you can use it either under the terms - * of the GPL or the X11 license, at your option. Note that this dual - * licensing only applies to this file, and not this project as a - * whole. - * - * a) This file 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 file is distributed in the hope that it will be useful - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * Or, alternatively - * - * b) Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use - * copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED , WITHOUT WARRANTY OF ANY KIND - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. */ /dts-v1/; -#include "armada-372x.dtsi" +#include "armada-3720-espressobin.dtsi" / { model = "Globalscale Marvell ESPRESSOBin Board"; compatible = "globalscale,espressobin", "marvell,armada3720", "marvell,armada3710"; - - chosen { - stdout-path = "serial0:115200n8"; - }; - - aliases { - ethernet0 = ð0; - i2c0 = &i2c0; - spi0 = &spi0; - }; - - memory { - device_type = "memory"; - reg = <0x00000000 0x00000000 0x00000000 0x20000000>; - }; - - vcc_sd_reg0: regulator@0 { - compatible = "regulator-gpio"; - regulator-name = "vcc_sd0"; - regulator-min-microvolt = <1800000>; - regulator-max-microvolt = <3300000>; - regulator-type = "voltage"; - states = <1800000 0x1 - 3300000 0x0>; - gpios = <&gpionb 4 GPIO_ACTIVE_HIGH>; - }; -}; - -&comphy { - max-lanes = <3>; - phy0 { - phy-type = ; - phy-speed = ; - }; - - phy1 { - phy-type = ; - phy-speed = ; - }; - - phy2 { - phy-type = ; - phy-speed = ; - }; -}; - -ð0 { - status = "okay"; - pinctrl-names = "default"; - pinctrl-0 = <&rgmii_pins>, <&smi_pins>; - phy-mode = "rgmii"; - phy_addr = <0x1>; - fixed-link { - speed = <1000>; - full-duplex; - }; -}; - -&i2c0 { - pinctrl-names = "default"; - pinctrl-0 = <&i2c1_pins>; - status = "okay"; -}; - -/* CON3 */ -&sata { - status = "okay"; -}; - -&sdhci0 { - pinctrl-names = "default"; - pinctrl-0 = <&sdio_pins>; - bus-width = <4>; - cd-gpios = <&gpionb 3 GPIO_ACTIVE_LOW>; - vqmmc-supply = <&vcc_sd_reg0>; - status = "okay"; -}; - -/* U11 */ -&sdhci1 { - non-removable; - bus-width = <8>; - mmc-ddr-1_8v; - mmc-hs400-1_8v; - marvell,xenon-emmc; - marvell,xenon-tun-count = <9>; - marvell,pad-type = "fixed-1-8v"; - - pinctrl-names = "default"; - pinctrl-0 = <&mmc_pins>; - status = "okay"; - - #address-cells = <1>; - #size-cells = <0>; - mmccard: mmccard@0 { - compatible = "mmc-card"; - reg = <0>; - }; -}; - -&spi0 { - status = "okay"; - pinctrl-names = "default"; - pinctrl-0 = <&spi_quad_pins>; - - spi-flash@0 { - #address-cells = <1>; - #size-cells = <1>; - compatible = "st,m25p128", "jedec,spi-nor"; - reg = <0>; /* Chip select 0 */ - spi-max-frequency = <50000000>; - m25p,fast-read; - -#ifdef CONFIG_ENV_IS_IN_SPI_FLASH - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; - - partition@firmware { - reg = <0 CONFIG_ENV_OFFSET>; - label = "firmware"; - }; - - partition@u-boot-env { - reg = ; - label = "u-boot-env"; - }; - }; -#endif - }; -}; - -/* Exported on the micro USB connector CON32 through an FTDI */ -&uart0 { - pinctrl-names = "default"; - pinctrl-0 = <&uart1_pins>; - status = "okay"; -}; - -/* CON29 */ -&usb2 { - status = "okay"; -}; - -/* CON31 */ -&usb3 { - status = "okay"; -}; - -&pcie0 { - pinctrl-names = "default"; - pinctrl-0 = <&pcie_pins>; - reset-gpios = <&gpiosb 3 GPIO_ACTIVE_LOW>; - status = "okay"; }; diff --git a/arch/arm/dts/armada-3720-espressobin.dtsi b/arch/arm/dts/armada-3720-espressobin.dtsi new file mode 100644 index 0000000000..cba6139be6 --- /dev/null +++ b/arch/arm/dts/armada-3720-espressobin.dtsi @@ -0,0 +1,210 @@ +/* + * Device Tree file for Marvell Armada 3720 community board + * (ESPRESSOBin) + * Copyright (C) 2016 Marvell + * + * Gregory CLEMENT + * Konstantin Porotchkin + * + * This file is dual-licensed: you can use it either under the terms + * of the GPL or the X11 license, at your option. Note that this dual + * licensing only applies to this file, and not this project as a + * whole. + * + * a) This file 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 file is distributed in the hope that it will be useful + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * Or, alternatively + * + * b) Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use + * copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED , WITHOUT WARRANTY OF ANY KIND + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ + +/dts-v1/; + +#include "armada-372x.dtsi" + +/ { + model = "Globalscale Marvell ESPRESSOBin Board"; + compatible = "globalscale,espressobin", "marvell,armada3720", "marvell,armada3710"; + + chosen { + stdout-path = "serial0:115200n8"; + }; + + aliases { + ethernet0 = ð0; + i2c0 = &i2c0; + spi0 = &spi0; + }; + + memory { + device_type = "memory"; + reg = <0x00000000 0x00000000 0x00000000 0x20000000>; + }; + + vcc_sd_reg0: regulator@0 { + compatible = "regulator-gpio"; + regulator-name = "vcc_sd0"; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <3300000>; + regulator-type = "voltage"; + states = <1800000 0x1 + 3300000 0x0>; + gpios = <&gpionb 4 GPIO_ACTIVE_HIGH>; + }; +}; + +&comphy { + max-lanes = <3>; + phy0 { + phy-type = ; + phy-speed = ; + }; + + phy1 { + phy-type = ; + phy-speed = ; + }; + + phy2 { + phy-type = ; + phy-speed = ; + }; +}; + +ð0 { + status = "okay"; + pinctrl-names = "default"; + pinctrl-0 = <&rgmii_pins>, <&smi_pins>; + phy-mode = "rgmii"; + phy_addr = <0x1>; + fixed-link { + speed = <1000>; + full-duplex; + }; +}; + +&i2c0 { + pinctrl-names = "default"; + pinctrl-0 = <&i2c1_pins>; + status = "okay"; +}; + +/* CON3 */ +&sata { + status = "okay"; +}; + +&sdhci0 { + pinctrl-names = "default"; + pinctrl-0 = <&sdio_pins>; + bus-width = <4>; + cd-gpios = <&gpionb 3 GPIO_ACTIVE_LOW>; + vqmmc-supply = <&vcc_sd_reg0>; + status = "okay"; +}; + +/* U11 */ +&sdhci1 { + non-removable; + bus-width = <8>; + mmc-ddr-1_8v; + mmc-hs400-1_8v; + marvell,xenon-emmc; + marvell,xenon-tun-count = <9>; + marvell,pad-type = "fixed-1-8v"; + + pinctrl-names = "default"; + pinctrl-0 = <&mmc_pins>; + status = "okay"; + + #address-cells = <1>; + #size-cells = <0>; + mmccard: mmccard@0 { + compatible = "mmc-card"; + reg = <0>; + }; +}; + +&spi0 { + status = "okay"; + pinctrl-names = "default"; + pinctrl-0 = <&spi_quad_pins>; + + spi-flash@0 { + #address-cells = <1>; + #size-cells = <1>; + compatible = "st,m25p128", "jedec,spi-nor"; + reg = <0>; /* Chip select 0 */ + spi-max-frequency = <50000000>; + m25p,fast-read; + +#ifdef CONFIG_ENV_IS_IN_SPI_FLASH + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + partition@firmware { + reg = <0 CONFIG_ENV_OFFSET>; + label = "firmware"; + }; + + partition@u-boot-env { + reg = ; + label = "u-boot-env"; + }; + }; +#endif + }; +}; + +/* Exported on the micro USB connector CON32 through an FTDI */ +&uart0 { + pinctrl-names = "default"; + pinctrl-0 = <&uart1_pins>; + status = "okay"; +}; + +/* CON29 */ +&usb2 { + status = "okay"; +}; + +/* CON31 */ +&usb3 { + status = "okay"; +}; + +&pcie0 { + pinctrl-names = "default"; + pinctrl-0 = <&pcie_pins>; + reset-gpios = <&gpiosb 3 GPIO_ACTIVE_LOW>; + status = "okay"; +}; diff --git a/board/Marvell/mvebu_armada-37xx/MAINTAINERS b/board/Marvell/mvebu_armada-37xx/MAINTAINERS index f2c0a582d7..d69af832fc 100644 --- a/board/Marvell/mvebu_armada-37xx/MAINTAINERS +++ b/board/Marvell/mvebu_armada-37xx/MAINTAINERS @@ -10,6 +10,14 @@ M: Konstantin Porotchkin S: Maintained F: configs/mvebu_espressobin-88f3720_defconfig +ESPRESSOBin-Ultra BOARD +M: Luka Kovacic +M: Robert Marko +M: Luka Perkov +S: Maintained +F: arch/arm/dts/armada-3720-espressobin-ultra.dts +F: configs/mvebu_espressobin-ultra-88f3720_defconfig + uDPU BOARD M: Vladimir Vid S: Maintained diff --git a/board/Marvell/mvebu_armada-37xx/board.c b/board/Marvell/mvebu_armada-37xx/board.c index 2de9c2ac17..21c1eb7b22 100644 --- a/board/Marvell/mvebu_armada-37xx/board.c +++ b/board/Marvell/mvebu_armada-37xx/board.c @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -55,6 +56,15 @@ DECLARE_GLOBAL_DATA_PTR; #define MVEBU_G2_SMI_PHY_CMD_REG (24) #define MVEBU_G2_SMI_PHY_DATA_REG (25) +/* Marvell 88E1512 */ +#define MII_MARVELL_PHY_PAGE 22 + +#define MV88E1512_GENERAL_CTRL 20 +#define MV88E1512_MODE_SGMII 1 +#define MV88E1512_RESET_OFFS 15 + +#define ULTRA_MV88E1512_PHYADDR 0x1 + /* * Memory Controller Registers * @@ -282,12 +292,68 @@ static int mii_multi_chip_mode_write(struct mii_dev *bus, int dev_smi_addr, return 0; } -/* Bring-up board-specific network stuff */ -int board_network_enable(struct mii_dev *bus) +void force_phy_88e1512_sgmii_to_copper(u16 devaddr) { - if (!of_machine_is_compatible("globalscale,espressobin")) - return 0; + const char *name; + u16 reg; + + name = miiphy_get_current_dev(); + if (name) { + /* SGMII-to-Copper mode initialization */ + + /* Select page 18 */ + miiphy_write(name, devaddr, MII_MARVELL_PHY_PAGE, 0x12); + /* In reg 20, write MODE[2:0] = 0x1 (SGMII to Copper) */ + miiphy_read(name, devaddr, MV88E1512_GENERAL_CTRL, ®); + reg &= ~0x7; + reg |= MV88E1512_MODE_SGMII; + miiphy_write(name, devaddr, MV88E1512_GENERAL_CTRL, reg); + /* PHY reset is necessary after changing MODE[2:0] */ + miiphy_read(name, devaddr, MV88E1512_GENERAL_CTRL, ®); + reg |= 1 << MV88E1512_RESET_OFFS; + miiphy_write(name, devaddr, MV88E1512_GENERAL_CTRL, reg); + /* Reset page selection */ + miiphy_write(name, devaddr, MII_MARVELL_PHY_PAGE, 0); + udelay(100); + } +} + +int board_network_enable_espressobin_ultra(struct mii_dev *bus) +{ + int i; + /* Setup 88E1512 SGMII-to-Copper mode */ + force_phy_88e1512_sgmii_to_copper(ULTRA_MV88E1512_PHYADDR); + /* + * FIXME: remove this code once Topaz driver gets available + * A3720 ESPRESSObin Ultra Board Only + * Configure Topaz switch (88E6341) + * Set port 1,2,3,4,5 to forwarding Mode (through Switch Port registers) + */ + for (i = 0; i <= 5; i++) { + mii_multi_chip_mode_write(bus, 3, MVEBU_PORT_CTRL_SMI_ADDR(i), + MVEBU_SW_PORT_CTRL_REG, + i == 5 ? 0x7c : 0x7f); + } + + /* RGMII Delay on Port 0 (CPU port), force link to 1000Mbps */ + mii_multi_chip_mode_write(bus, 3, MVEBU_PORT_CTRL_SMI_ADDR(0), + MVEBU_SW_LINK_CTRL_REG, 0xe002); + + /* Power up PHY 1, 2, 3, 4, 5 (through Global 2 registers) */ + mii_multi_chip_mode_write(bus, 3, MVEBU_SW_G2_SMI_ADDR, + MVEBU_G2_SMI_PHY_DATA_REG, 0x1140); + for (i = 1; i <= 5; i++) { + mii_multi_chip_mode_write(bus, 3, MVEBU_SW_G2_SMI_ADDR, + MVEBU_G2_SMI_PHY_CMD_REG, 0x9400 + + (MVEBU_PORT_CTRL_SMI_ADDR(i) << 5)); + } + + return 0; +} + +int board_network_enable_espressobin(struct mii_dev *bus) +{ /* * FIXME: remove this code once Topaz driver gets available * A3720 Community Board Only @@ -328,6 +394,16 @@ int board_network_enable(struct mii_dev *bus) return 0; } +/* Bring-up the board-specific networking */ +int board_network_enable(struct mii_dev *bus) +{ + if (of_machine_is_compatible("globalscale,espressobin")) + return board_network_enable_espressobin(bus); + if (of_machine_is_compatible("globalscale,espressobin-ultra")) + return board_network_enable_espressobin_ultra(bus); + return 0; +} + #if defined(CONFIG_OF_BOARD_SETUP) && defined(CONFIG_ENV_IS_IN_SPI_FLASH) int ft_board_setup(void *blob, struct bd_info *bd) { @@ -336,8 +412,12 @@ int ft_board_setup(void *blob, struct bd_info *bd) int parts_off; int part_off; - /* Fill SPI MTD partitions for Linux kernel on Espressobin */ - if (!of_machine_is_compatible("globalscale,espressobin")) + /* + * Fill SPI MTD partitions for the Linux kernel on ESPRESSOBin and + * ESPRESSOBin Ultra boards. + */ + if (!of_machine_is_compatible("globalscale,espressobin") && + !of_machine_is_compatible("globalscale,espressobin-ultra")) return 0; spi_off = fdt_node_offset_by_compatible(blob, -1, "jedec,spi-nor"); diff --git a/configs/mvebu_espressobin-ultra-88f3720_defconfig b/configs/mvebu_espressobin-ultra-88f3720_defconfig new file mode 100644 index 0000000000..1bac0a96ad --- /dev/null +++ b/configs/mvebu_espressobin-ultra-88f3720_defconfig @@ -0,0 +1,93 @@ +CONFIG_ARM=y +CONFIG_ARCH_CPU_INIT=y +CONFIG_ARCH_MVEBU=y +CONFIG_SYS_TEXT_BASE=0x00000000 +CONFIG_SYS_MALLOC_F_LEN=0x2000 +CONFIG_NR_DRAM_BANKS=1 +CONFIG_TARGET_MVEBU_ARMADA_37XX=y +CONFIG_ENV_SIZE=0x10000 +CONFIG_ENV_OFFSET=0x3F0000 +CONFIG_ENV_SECT_SIZE=0x10000 +CONFIG_DM_GPIO=y +CONFIG_DEBUG_UART_BASE=0xd0012000 +CONFIG_DEFAULT_DEVICE_TREE="armada-3720-espressobin-ultra" +CONFIG_DEBUG_UART=y +CONFIG_AHCI=y +CONFIG_DISTRO_DEFAULTS=y +# CONFIG_SYS_MALLOC_CLEAR_ON_INIT is not set +CONFIG_OF_BOARD_SETUP=y +CONFIG_FIT=y +CONFIG_FIT_VERBOSE=y +CONFIG_FIT_BEST_MATCH=y +CONFIG_AUTOBOOT_KEYED=y +CONFIG_AUTOBOOT_PROMPT="Autoboot in %d seconds, to stop use 's' key\n" +CONFIG_AUTOBOOT_STOP_STR="s" +CONFIG_AUTOBOOT_KEYED_CTRLC=y +CONFIG_HUSH_PARSER=y +CONFIG_SYS_CONSOLE_INFO_QUIET=y +# CONFIG_DISPLAY_CPUINFO is not set +# CONFIG_DISPLAY_BOARDINFO is not set +CONFIG_DISPLAY_BOARDINFO_LATE=y +CONFIG_ARCH_EARLY_INIT_R=y +CONFIG_BOARD_EARLY_INIT_F=y +CONFIG_BOARD_LATE_INIT=y +# CONFIG_CMD_FLASH is not set +CONFIG_CMD_GPIO=y +CONFIG_CMD_I2C=y +CONFIG_CMD_MMC=y +CONFIG_CMD_MTD=y +CONFIG_CMD_PCI=y +CONFIG_CMD_SPI=y +CONFIG_CMD_USB=y +CONFIG_CMD_WDT=y +# CONFIG_CMD_SETEXPR is not set +CONFIG_CMD_TFTPPUT=y +CONFIG_CMD_CACHE=y +CONFIG_CMD_TIME=y +CONFIG_CMD_MVEBU_BUBT=y +CONFIG_MVEBU_MAC_HW_INFO=y +CONFIG_CMD_EXT4_WRITE=y +CONFIG_MAC_PARTITION=y +CONFIG_ENV_OVERWRITE=y +CONFIG_ENV_IS_IN_SPI_FLASH=y +CONFIG_SYS_RELOC_GD_ENV_ADDR=y +CONFIG_NET_RANDOM_ETHADDR=y +CONFIG_AHCI_MVEBU=y +CONFIG_CLK=y +CONFIG_CLK_MVEBU=y +CONFIG_DM_I2C=y +CONFIG_MISC=y +CONFIG_MMC_SDHCI=y +CONFIG_MMC_SDHCI_SDMA=y +CONFIG_MMC_SDHCI_XENON=y +CONFIG_MTD=y +CONFIG_DM_MTD=y +CONFIG_SF_DEFAULT_MODE=0 +CONFIG_SPI_FLASH_MACRONIX=y +CONFIG_SPI_FLASH_MTD=y +CONFIG_PHY_MARVELL=y +CONFIG_PHY_GIGE=y +CONFIG_MVNETA=y +CONFIG_PCI=y +CONFIG_PCI_AARDVARK=y +CONFIG_PHY=y +CONFIG_MVEBU_COMPHY_SUPPORT=y +CONFIG_PINCTRL=y +CONFIG_PINCTRL_ARMADA_37XX=y +CONFIG_DM_REGULATOR_GPIO=y +CONFIG_DEBUG_UART_SHIFT=2 +CONFIG_DEBUG_UART_ANNOUNCE=y +CONFIG_MVEBU_A3700_UART=y +CONFIG_MVEBU_A3700_SPI=y +CONFIG_USB=y +CONFIG_USB_XHCI_HCD=y +CONFIG_USB_EHCI_HCD=y +CONFIG_USB_HOST_ETHER=y +# CONFIG_WATCHDOG_AUTOSTART is not set +CONFIG_WDT=y +CONFIG_WDT_ARMADA_37XX=y +CONFIG_SHA1=y +CONFIG_DM_RTC=y +CONFIG_RTC_PCF8563=y +CONFIG_LED=y +CONFIG_LED_GPIO=y