mirror of
https://github.com/u-boot/u-boot.git
synced 2025-04-22 04:44:46 +00:00
arm: mvebu: turris_omnia: Extend EEPROM info structure
Extend the Omnia EEPROM information structure in preparation for more variables to be stored there. Signed-off-by: Marek Behún <kabel@kernel.org>
This commit is contained in:
parent
6ce7559585
commit
b5a6120227
2 changed files with 46 additions and 7 deletions
|
@ -60,9 +60,13 @@ static struct eeprom_field omnia_layout[] = {
|
|||
_DEF_FIELD("RAM size in GB", 4, ramsz),
|
||||
_DEF_FIELD("Wi-Fi Region", 4, region),
|
||||
_DEF_FIELD("CRC32 checksum", 4, bin),
|
||||
_DEF_FIELD("Extended reserved fields", 44, reserved),
|
||||
_DEF_FIELD("Extended CRC32 checksum", 4, bin),
|
||||
};
|
||||
|
||||
static struct eeprom_field *crc_field = &omnia_layout[3];
|
||||
static struct eeprom_field *ext_crc_field =
|
||||
&omnia_layout[ARRAY_SIZE(omnia_layout) - 1];
|
||||
|
||||
static int omnia_update_field(struct eeprom_layout *layout, char *field_name,
|
||||
char *new_data)
|
||||
|
@ -91,6 +95,11 @@ static int omnia_update_field(struct eeprom_layout *layout, char *field_name,
|
|||
put_unaligned_le32(crc, crc_field->buf);
|
||||
}
|
||||
|
||||
if (field < ext_crc_field) {
|
||||
u32 crc = crc32(0, layout->data, 44);
|
||||
put_unaligned_le32(crc, ext_crc_field->buf);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -99,7 +108,7 @@ void eeprom_layout_assign(struct eeprom_layout *layout, int)
|
|||
layout->fields = omnia_layout;
|
||||
layout->num_of_fields = ARRAY_SIZE(omnia_layout);
|
||||
layout->update = omnia_update_field;
|
||||
layout->data_size = 16;
|
||||
layout->data_size = 64;
|
||||
}
|
||||
|
||||
int eeprom_layout_detect(unsigned char *)
|
||||
|
|
|
@ -429,12 +429,40 @@ struct omnia_eeprom {
|
|||
u32 ramsize;
|
||||
char region[4];
|
||||
u32 crc;
|
||||
|
||||
/* second part (only considered if crc2 is not all-ones) */
|
||||
u8 reserved[44];
|
||||
u32 crc2;
|
||||
};
|
||||
|
||||
static bool is_omnia_eeprom_second_part_valid(const struct omnia_eeprom *oep)
|
||||
{
|
||||
return oep->crc2 != 0xffffffff;
|
||||
}
|
||||
|
||||
static void make_omnia_eeprom_second_part_invalid(struct omnia_eeprom *oep)
|
||||
{
|
||||
oep->crc2 = 0xffffffff;
|
||||
}
|
||||
|
||||
static bool check_eeprom_crc(const void *buf, size_t size, u32 expected,
|
||||
const char *name)
|
||||
{
|
||||
u32 crc;
|
||||
|
||||
crc = crc32(0, buf, size);
|
||||
if (crc != expected) {
|
||||
printf("bad %s EEPROM CRC (stored %08x, computed %08x)\n",
|
||||
name, expected, crc);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool omnia_read_eeprom(struct omnia_eeprom *oep)
|
||||
{
|
||||
struct udevice *chip;
|
||||
u32 crc;
|
||||
int ret;
|
||||
|
||||
chip = omnia_get_i2c_chip("EEPROM", OMNIA_I2C_EEPROM_CHIP_ADDR,
|
||||
|
@ -455,12 +483,14 @@ static bool omnia_read_eeprom(struct omnia_eeprom *oep)
|
|||
return false;
|
||||
}
|
||||
|
||||
crc = crc32(0, (void *)oep, sizeof(*oep) - 4);
|
||||
if (crc != oep->crc) {
|
||||
printf("bad EEPROM CRC (stored %08x, computed %08x)\n",
|
||||
oep->crc, crc);
|
||||
if (!check_eeprom_crc(oep, offsetof(struct omnia_eeprom, crc), oep->crc,
|
||||
"first"))
|
||||
return false;
|
||||
}
|
||||
|
||||
if (is_omnia_eeprom_second_part_valid(oep) &&
|
||||
!check_eeprom_crc(oep, offsetof(struct omnia_eeprom, crc2),
|
||||
oep->crc2, "second"))
|
||||
make_omnia_eeprom_second_part_invalid(oep);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue