summaryrefslogtreecommitdiff
path: root/board
diff options
context:
space:
mode:
authorTom Rini <[email protected]>2024-09-16 14:48:13 -0600
committerTom Rini <[email protected]>2024-09-16 14:48:13 -0600
commit19dbc09405d3503ce3efef3c2e4b4f0f1a03372d (patch)
treeeb40b0e0cb3c32dbafb25cc7fb6f988908c32ca9 /board
parent979207ed6bac1b148802abb85750fc5e9cea223e (diff)
parentc97ada2dc66934ee00a7a03d9ed078bdfb7b4039 (diff)
Merge tag 'v2024.10-rc5' into next
Prepare v2024.10-rc5
Diffstat (limited to 'board')
-rw-r--r--board/CZ.NIC/turris_omnia/turris_omnia.c101
-rw-r--r--board/starfive/visionfive2/spl.c15
2 files changed, 97 insertions, 19 deletions
diff --git a/board/CZ.NIC/turris_omnia/turris_omnia.c b/board/CZ.NIC/turris_omnia/turris_omnia.c
index 2f29d26edf8..eb88ee7f1ed 100644
--- a/board/CZ.NIC/turris_omnia/turris_omnia.c
+++ b/board/CZ.NIC/turris_omnia/turris_omnia.c
@@ -23,6 +23,7 @@
#include <dt-bindings/gpio/gpio.h>
#include <fdt_support.h>
#include <hexdump.h>
+#include <i2c_eeprom.h>
#include <time.h>
#include <turris-omnia-mcu-interface.h>
#include <linux/bitops.h>
@@ -46,6 +47,9 @@ DECLARE_GLOBAL_DATA_PTR;
#define OMNIA_I2C_EEPROM_CHIP_LEN 2
#define OMNIA_I2C_EEPROM_MAGIC 0x0341a034
+#define OMNIA_RESET_TO_LOWER_DDR_SPEED 9
+#define OMNIA_LOWER_DDR_SPEED "1333H"
+
#define A385_SYS_RSTOUT_MASK MVEBU_REGISTER(0x18260)
#define A385_SYS_RSTOUT_MASK_WD BIT(10)
@@ -205,6 +209,20 @@ static u32 omnia_mcu_crc32(const void *p, size_t len)
return ~bitrev32(crc);
}
+static int omnia_mcu_get_reset(void)
+{
+ u8 reset_status;
+ int ret;
+
+ ret = omnia_mcu_read(CMD_GET_RESET, &reset_status, 1);
+ if (ret) {
+ printf("omnia_mcu_read failed: %i, reset status unknown!\n", ret);
+ return ret;
+ }
+
+ return reset_status;
+}
+
/* Can only be called after relocation, since it needs cleared BSS */
static int omnia_mcu_board_info(char *serial, u8 *mac, char *version)
{
@@ -462,20 +480,27 @@ static bool check_eeprom_crc(const void *buf, size_t size, u32 expected,
return true;
}
+static struct udevice *omnia_get_eeprom(void)
+{
+ return omnia_get_i2c_chip("EEPROM", OMNIA_I2C_EEPROM_CHIP_ADDR,
+ OMNIA_I2C_EEPROM_CHIP_LEN);
+}
+
static bool omnia_read_eeprom(struct omnia_eeprom *oep)
{
- struct udevice *chip;
+ struct udevice *eeprom = omnia_get_eeprom();
int ret;
- chip = omnia_get_i2c_chip("EEPROM", OMNIA_I2C_EEPROM_CHIP_ADDR,
- OMNIA_I2C_EEPROM_CHIP_LEN);
-
- if (!chip)
+ if (!eeprom)
return false;
- ret = dm_i2c_read(chip, 0, (void *)oep, sizeof(*oep));
+ if (IS_ENABLED(CONFIG_SPL_BUILD))
+ ret = dm_i2c_read(eeprom, 0, (void *)oep, sizeof(*oep));
+ else
+ ret = i2c_eeprom_read(eeprom, 0, (void *)oep, sizeof(*oep));
+
if (ret) {
- printf("dm_i2c_read failed: %i, cannot read EEPROM\n", ret);
+ printf("cannot read EEPROM: %d\n", ret);
return false;
}
@@ -497,6 +522,35 @@ static bool omnia_read_eeprom(struct omnia_eeprom *oep)
return true;
}
+static void omnia_eeprom_set_lower_ddr_speed(void)
+{
+ struct udevice *eeprom = omnia_get_eeprom();
+ struct omnia_eeprom oep;
+ int ret;
+
+ if (!eeprom || !omnia_read_eeprom(&oep))
+ return;
+
+ puts("Setting DDR speed to " OMNIA_LOWER_DDR_SPEED " in EEPROM as requested by reset button... ");
+
+ /* check if already set */
+ if (!strncmp(oep.ddr_speed, OMNIA_LOWER_DDR_SPEED, sizeof(oep.ddr_speed)) &&
+ (oep.old_ddr_training == 0 || oep.old_ddr_training == 0xff)) {
+ puts("was already set\n");
+ return;
+ }
+
+ strncpy(oep.ddr_speed, OMNIA_LOWER_DDR_SPEED, sizeof(oep.ddr_speed));
+ oep.old_ddr_training = 0xff;
+ oep.crc2 = crc32(0, (const void *)&oep, offsetof(struct omnia_eeprom, crc2));
+
+ ret = i2c_eeprom_write(eeprom, 0, (const void *)&oep, sizeof(oep));
+ if (ret)
+ printf("cannot write EEPROM: %d\n", ret);
+ else
+ puts("done\n");
+}
+
int omnia_get_ram_size_gb(void)
{
static int ram_size;
@@ -526,6 +580,13 @@ bool board_use_old_ddr3_training(void)
{
struct omnia_eeprom oep;
+ /*
+ * If lower DDR speed is requested by reset button, we can't use old DDR
+ * training algorithm.
+ */
+ if (omnia_mcu_get_reset() == OMNIA_RESET_TO_LOWER_DDR_SPEED)
+ return false;
+
if (!omnia_read_eeprom(&oep))
return false;
@@ -706,13 +767,19 @@ static void fixup_speed_in_ddr_topology(struct mv_ddr_topology_map *topology)
const struct omnia_ddr_speed *setting;
const char *speed;
static bool done;
+ int reset_status;
if (done)
return;
done = true;
- speed = omnia_get_ddr_speed();
+ reset_status = omnia_mcu_get_reset();
+ if (reset_status == OMNIA_RESET_TO_LOWER_DDR_SPEED)
+ speed = OMNIA_LOWER_DDR_SPEED;
+ else
+ speed = omnia_get_ddr_speed();
+
if (!speed)
return;
@@ -729,7 +796,10 @@ static void fixup_speed_in_ddr_topology(struct mv_ddr_topology_map *topology)
if (params->speed_bin_index == setting->speed_bin)
return;
- printf("Fixing up DDR3 speed (EEPROM defines %s)\n", speed);
+ if (reset_status == OMNIA_RESET_TO_LOWER_DDR_SPEED)
+ printf("Fixing up DDR3 speed to %s as requested by reset button\n", speed);
+ else
+ printf("Fixing up DDR3 speed (EEPROM defines %s)\n", speed);
params->speed_bin_index = setting->speed_bin;
params->memory_freq = setting->freq;
@@ -766,8 +836,7 @@ static int set_regdomain(void)
static void handle_reset_button(void)
{
const char * const vars[1] = { "bootcmd_rescue", };
- int ret;
- u8 reset_status;
+ int reset_status;
/*
* Ensure that bootcmd_rescue has always stock value, so that running
@@ -776,12 +845,12 @@ static void handle_reset_button(void)
*/
env_set_default_vars(1, (char * const *)vars, 0);
- ret = omnia_mcu_read(CMD_GET_RESET, &reset_status, 1);
- if (ret) {
- printf("omnia_mcu_read failed: %i, reset status unknown!\n",
- ret);
+ reset_status = omnia_mcu_get_reset();
+ if (reset_status < 0)
return;
- }
+
+ if (reset_status == OMNIA_RESET_TO_LOWER_DDR_SPEED)
+ return omnia_eeprom_set_lower_ddr_speed();
env_set_ulong("omnia_reset", reset_status);
diff --git a/board/starfive/visionfive2/spl.c b/board/starfive/visionfive2/spl.c
index b794b73b6bd..f55c6b5d34c 100644
--- a/board/starfive/visionfive2/spl.c
+++ b/board/starfive/visionfive2/spl.c
@@ -170,23 +170,32 @@ void spl_fdt_fixup_mars_cm(void *fdt)
{
const char *compat;
const char *model;
+ int compat_size;
spl_fdt_fixup_mars(fdt);
if (!get_mmc_size_from_eeprom()) {
int offset;
+ static const char
+ compat_cm_lite[] = "milkv,mars-cm-lite\0starfive,jh7110";
model = "Milk-V Mars CM Lite";
- compat = "milkv,mars-cm-lite\0starfive,jh7110";
+ compat = compat_cm_lite;
+ compat_size = sizeof(compat_cm_lite);
offset = fdt_path_offset(fdt, "/soc/pinctrl/mmc0-pins/mmc0-pins-rest");
/* GPIOMUX(22, GPOUT_SYS_SDIO0_RST, GPOEN_ENABLE, GPI_NONE) */
fdt_setprop_u32(fdt, offset, "pinmux", 0xff130016);
} else {
+ static const char
+ compat_cm[] = "milkv,mars-cm\0starfive,jh7110";
+
model = "Milk-V Mars CM";
- compat = "milkv,mars-cm\0starfive,jh7110";
+ compat = compat_cm;
+ compat_size = sizeof(compat_cm);
}
- fdt_setprop(fdt, fdt_path_offset(fdt, "/"), "compatible", compat, sizeof(compat));
+ fdt_setprop(fdt, fdt_path_offset(fdt, "/"),
+ "compatible", compat, compat_size);
fdt_setprop_string(fdt, fdt_path_offset(fdt, "/"), "model", model);
}