aboutsummaryrefslogtreecommitdiff
path: root/board/CZ.NIC/turris_mox
diff options
context:
space:
mode:
authorMarek BehĂșn2023-10-20 16:29:16 +0200
committerStefan Roese2023-10-26 14:49:36 +0200
commit94c0f0b177a17d419b319d173d21e23c432385b4 (patch)
tree8e31b7df80387cf5f7d158c40c54a063adf44933 /board/CZ.NIC/turris_mox
parentfb428b61819444b9337075f49c72f326f5d12085 (diff)
arm: mvebu: turris_mox: Extend to support RIPE Atlas Probe
Extend Turris Mox board code to support CZ.NIC's RIPE Atlas Probe. Signed-off-by: Marek BehĂșn <kabel@kernel.org> Reviewed-by: Stefan Roese <sr@denx.de>
Diffstat (limited to 'board/CZ.NIC/turris_mox')
-rw-r--r--board/CZ.NIC/turris_mox/mox_sp.c12
-rw-r--r--board/CZ.NIC/turris_mox/mox_sp.h8
-rw-r--r--board/CZ.NIC/turris_mox/turris_mox.c72
3 files changed, 81 insertions, 11 deletions
diff --git a/board/CZ.NIC/turris_mox/mox_sp.c b/board/CZ.NIC/turris_mox/mox_sp.c
index 87f67512fba..11d87564717 100644
--- a/board/CZ.NIC/turris_mox/mox_sp.c
+++ b/board/CZ.NIC/turris_mox/mox_sp.c
@@ -10,6 +10,8 @@
#include <linux/delay.h>
#include <mach/mbox.h>
+#include "mox_sp.h"
+
const char *mox_sp_get_ecdsa_public_key(void)
{
static char public_key[135];
@@ -42,12 +44,13 @@ static inline void res_to_mac(u8 *mac, u32 t1, u32 t2)
mac[5] = t2;
}
-int mbox_sp_get_board_info(u64 *sn, u8 *mac1, u8 *mac2, int *bv, int *ram)
+int mbox_sp_get_board_info(u64 *sn, u8 *mac1, u8 *mac2, int *bv, int *ram,
+ enum cznic_a3720_board *board)
{
- u32 out[8];
+ u32 out[9];
int res;
- res = mbox_do_cmd(MBOX_CMD_BOARD_INFO, NULL, 0, out, 8);
+ res = mbox_do_cmd(MBOX_CMD_BOARD_INFO, NULL, 0, out, 9);
if (res < 0)
return res;
@@ -69,5 +72,8 @@ int mbox_sp_get_board_info(u64 *sn, u8 *mac1, u8 *mac2, int *bv, int *ram)
if (mac2)
res_to_mac(mac2, out[6], out[7]);
+ if (board)
+ *board = out[8] + 1;
+
return 0;
}
diff --git a/board/CZ.NIC/turris_mox/mox_sp.h b/board/CZ.NIC/turris_mox/mox_sp.h
index 83b60374585..720880d5df3 100644
--- a/board/CZ.NIC/turris_mox/mox_sp.h
+++ b/board/CZ.NIC/turris_mox/mox_sp.h
@@ -8,8 +8,14 @@
#include <common.h>
+enum cznic_a3720_board {
+ BOARD_UNDEFINED = 0x0,
+ BOARD_TURRIS_MOX = 0x1,
+ BOARD_RIPE_ATLAS = 0x3,
+};
+
const char *mox_sp_get_ecdsa_public_key(void);
int mbox_sp_get_board_info(u64 *sn, u8 *mac1, u8 *mac2, int *bv,
- int *ram);
+ int *ram, enum cznic_a3720_board *board);
#endif /* _BOARD_CZNIC_TURRIS_MOX_MOX_SP_H_ */
diff --git a/board/CZ.NIC/turris_mox/turris_mox.c b/board/CZ.NIC/turris_mox/turris_mox.c
index 370c2668b08..63b86992194 100644
--- a/board/CZ.NIC/turris_mox/turris_mox.c
+++ b/board/CZ.NIC/turris_mox/turris_mox.c
@@ -15,6 +15,7 @@
#include <dm.h>
#include <dm/of_extra.h>
#include <env.h>
+#include <env_internal.h>
#include <event.h>
#include <fdt_support.h>
#include <init.h>
@@ -45,6 +46,26 @@
DECLARE_GLOBAL_DATA_PTR;
+int board_fit_config_name_match(const char *name)
+{
+ if (!gd->board_type) {
+ enum cznic_a3720_board board;
+
+ if (mbox_sp_get_board_info(NULL, NULL, NULL, NULL, NULL,
+ &board) < 0) {
+ printf("Cannot determine board, defaulting to Turris MOX!\n");
+ board = BOARD_TURRIS_MOX;
+ }
+
+ gd->board_type = board;
+ }
+
+ return !((gd->board_type == BOARD_TURRIS_MOX &&
+ !strcmp(name, "armada-3720-turris-mox")) ||
+ (gd->board_type == BOARD_RIPE_ATLAS &&
+ !strcmp(name, "armada-3720-ripe-atlas")));
+}
+
#if defined(CONFIG_OF_BOARD_FIXUP)
int board_fix_fdt(void *blob)
{
@@ -53,6 +74,9 @@ int board_fix_fdt(void *blob)
int i, size, ret;
bool eth1_sgmii;
+ if (gd->board_type != BOARD_TURRIS_MOX)
+ return 0;
+
/*
* SPI driver is not loaded in driver model yet, but we have to find out
* if pcie should be enabled in U-Boot's device tree. Therefore we have
@@ -388,16 +412,23 @@ static void load_spi_dtb(void)
int misc_init_r(void)
{
+ int i, ret, addrcnt;
u8 mac[2][6];
- int i, ret;
- ret = mbox_sp_get_board_info(NULL, mac[0], mac[1], NULL, NULL);
+ ret = mbox_sp_get_board_info(NULL, mac[0], mac[1], NULL, NULL, NULL);
if (ret < 0) {
printf("Cannot read data from OTP!\n");
return 0;
}
- for (i = 0; i < 2; ++i) {
+ if (gd->board_type == BOARD_TURRIS_MOX)
+ addrcnt = 2;
+ else if (gd->board_type == BOARD_RIPE_ATLAS)
+ addrcnt = 1;
+ else
+ addrcnt = 0;
+
+ for (i = 0; i < addrcnt; ++i) {
u8 oldmac[6];
if (is_valid_ethaddr(mac[i]) &&
@@ -405,7 +436,13 @@ int misc_init_r(void)
eth_env_set_enetaddr_by_index("eth", i, mac[i]);
}
- load_spi_dtb();
+ if (gd->board_type == BOARD_RIPE_ATLAS) {
+ env_set("board", "ripe_atlas");
+ env_set("board_name", "ripe_atlas");
+ env_set("fdtfile", "marvell/armada-3720-ripe-atlas.dtb");
+ } else {
+ load_spi_dtb();
+ }
return 0;
}
@@ -528,14 +565,15 @@ static void handle_reset_button(void)
int show_board_info(void)
{
int i, ret, board_version, ram_size, is_sd;
- const char *pub_key;
+ const char *pub_key, *model;
const u8 *topology;
u64 serial_number;
- printf("Model: CZ.NIC Turris Mox Board\n");
+ model = fdt_getprop(gd->fdt_blob, 0, "model", NULL);
+ printf("Model: %s\n", model);
ret = mbox_sp_get_board_info(&serial_number, NULL, NULL, &board_version,
- &ram_size);
+ &ram_size, NULL);
if (ret < 0) {
printf(" Cannot read board info: %i\n", ret);
} else {
@@ -550,6 +588,9 @@ int show_board_info(void)
else
printf(" Cannot read ECDSA Public Key\n");
+ if (gd->board_type != BOARD_TURRIS_MOX)
+ return 0;
+
ret = mox_get_topology(&topology, &module_count, &is_sd);
if (ret)
printf("Cannot read module topology!\n");
@@ -668,10 +709,24 @@ err:
return NULL;
}
+enum env_location env_get_location(enum env_operation op, int prio)
+{
+ if (prio > 0)
+ return ENVL_UNKNOWN;
+
+ if (gd->board_type == BOARD_RIPE_ATLAS)
+ return ENVL_MMC;
+
+ return ENVL_SPI_FLASH;
+}
+
static int last_stage_init(void)
{
struct gpio_desc reset_gpio = {};
+ if (gd->board_type != BOARD_TURRIS_MOX)
+ return 0;
+
/* configure modules */
if (get_reset_gpio(&reset_gpio) < 0)
goto handle_reset_btn;
@@ -801,6 +856,9 @@ int ft_board_setup(void *blob, struct bd_info *bd)
{
int res;
+ if (gd->board_type != BOARD_TURRIS_MOX)
+ return 0;
+
/*
* If MOX B (PCI), MOX F (USB) or MOX G (Passthrough PCI) modules are
* connected, enable the PCIe node.