mirror of
https://github.com/u-boot/u-boot.git
synced 2025-04-22 12:54:37 +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("RAM size in GB", 4, ramsz),
|
||||||
_DEF_FIELD("Wi-Fi Region", 4, region),
|
_DEF_FIELD("Wi-Fi Region", 4, region),
|
||||||
_DEF_FIELD("CRC32 checksum", 4, bin),
|
_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 *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,
|
static int omnia_update_field(struct eeprom_layout *layout, char *field_name,
|
||||||
char *new_data)
|
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);
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -99,7 +108,7 @@ void eeprom_layout_assign(struct eeprom_layout *layout, int)
|
||||||
layout->fields = omnia_layout;
|
layout->fields = omnia_layout;
|
||||||
layout->num_of_fields = ARRAY_SIZE(omnia_layout);
|
layout->num_of_fields = ARRAY_SIZE(omnia_layout);
|
||||||
layout->update = omnia_update_field;
|
layout->update = omnia_update_field;
|
||||||
layout->data_size = 16;
|
layout->data_size = 64;
|
||||||
}
|
}
|
||||||
|
|
||||||
int eeprom_layout_detect(unsigned char *)
|
int eeprom_layout_detect(unsigned char *)
|
||||||
|
|
|
@ -429,12 +429,40 @@ struct omnia_eeprom {
|
||||||
u32 ramsize;
|
u32 ramsize;
|
||||||
char region[4];
|
char region[4];
|
||||||
u32 crc;
|
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)
|
static bool omnia_read_eeprom(struct omnia_eeprom *oep)
|
||||||
{
|
{
|
||||||
struct udevice *chip;
|
struct udevice *chip;
|
||||||
u32 crc;
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
chip = omnia_get_i2c_chip("EEPROM", OMNIA_I2C_EEPROM_CHIP_ADDR,
|
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;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
crc = crc32(0, (void *)oep, sizeof(*oep) - 4);
|
if (!check_eeprom_crc(oep, offsetof(struct omnia_eeprom, crc), oep->crc,
|
||||||
if (crc != oep->crc) {
|
"first"))
|
||||||
printf("bad EEPROM CRC (stored %08x, computed %08x)\n",
|
|
||||||
oep->crc, crc);
|
|
||||||
return false;
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue