
This solves the potentially common problem of getting a specific tlv entry from an eeprom in board-files, without having to introduce several variables, error handling, memcpy and 0-terminating the string.
Signed-off-by: Josua Mayer josua@solid-run.com --- include/tlv_eeprom.h | 12 ++++++++++++ lib/tlv/tlv_eeprom.c | 25 +++++++++++++++++++++++++ 2 files changed, 37 insertions(+)
diff --git a/include/tlv_eeprom.h b/include/tlv_eeprom.h index c81c58837d..5989c611f5 100644 --- a/include/tlv_eeprom.h +++ b/include/tlv_eeprom.h @@ -166,6 +166,18 @@ bool tlvinfo_add_tlv(u8 *eeprom, int code, char *strval); */ bool tlvinfo_delete_tlv(u8 *eeprom, u8 code);
+/** + * Read the TLV entry with specified code to a buffer as terminated C string. + * @eeprom: Pointer to buffer holding the TLV EEPROM binary data. + * @code: The TLV Code of the entry to read. + * @buffer: Pointer to buffer where the value will be stored. Must have capacity + * for the string representation of the data including null terminator. + * @length: size of the buffer where the value will be stored. + * + * Return length of string on success, -1 on error. + */ +ssize_t tlvinfo_read_tlv(u8 *eeprom, u8 code, u8 *buffer, size_t length); + /** * tlvinfo_update_crc * diff --git a/lib/tlv/tlv_eeprom.c b/lib/tlv/tlv_eeprom.c index 464f0aa1fa..205960e8f2 100644 --- a/lib/tlv/tlv_eeprom.c +++ b/lib/tlv/tlv_eeprom.c @@ -350,6 +350,31 @@ bool tlvinfo_add_tlv(u8 *eeprom, int tcode, char *strval) return true; }
+/** + * Read the TLV entry with specified code to a buffer as terminated C string. + */ +ssize_t tlvinfo_read_tlv(u8 *eeprom, u8 code, u8 *buffer, size_t length) +{ + int index; + struct tlvinfo_tlv *tlv; + + // read sku from part-number field + if (tlvinfo_find_tlv(eeprom, code, &index)) { + tlv = (struct tlvinfo_tlv *)&eeprom[index]; + if (tlv->length > length) { + pr_err("%s: tlv value (%d) larger than buffer (%zu)!\n", + __func__, tlv->length + 1, length); + return -1; + } + memcpy(buffer, tlv->value, tlv->length); + buffer[tlv->length] = 0; + + return tlv->length; + } + + return -1; +} + /** * set_mac *