Add defintions and function to encode FRU record
This patch adds helper API to encode a FRU record taking FRU
fields, record type, record set id, encode type as inputs and appending
the FRU record to the FRU table.
Change-Id: I789b0e3b1eebbc225291de087fa45b0d87d4944f
Signed-off-by: Tom Joseph <tomjoseph@in.ibm.com>
diff --git a/libpldm/fru.h b/libpldm/fru.h
index 8e8af25..2b5dd9f 100644
--- a/libpldm/fru.h
+++ b/libpldm/fru.h
@@ -22,6 +22,44 @@
PLDM_GET_FRU_RECORD_TABLE = 0X02,
};
+/** @brief FRU record types
+ */
+enum pldm_fru_record_type {
+ PLDM_FRU_RECORD_TYPE_GENERAL = 0X01,
+ PLDM_FRU_RECORD_TYPE_OEM = 0XFE,
+};
+
+/** @brief Encoding type for FRU fields
+ */
+enum pldm_fru_field_encoding {
+ PLDM_FRU_ENCODING_UNSPECIFIED = 0X00,
+ PLDM_FRU_ENCODING_ASCII = 0X01,
+ PLDM_FRU_ENCODING_UTF8 = 0X02,
+ PLDM_FRU_ENCODING_UTF16 = 0X03,
+ PLDM_FRU_ENCODING_UTF16LE = 0X04,
+ PLDM_FRU_ENCODING_UTF16BE = 0X05,
+};
+
+/** @brief FRU field types
+ */
+enum pldm_fru_field_type {
+ PLDM_FRU_FIELD_TYPE_CHASSIS = 0X01,
+ PLDM_FRU_FIELD_TYPE_MODEL = 0X02,
+ PLDM_FRU_FIELD_TYPE_PN = 0X03,
+ PLDM_FRU_FIELD_TYPE_SN = 0X04,
+ PLDM_FRU_FIELD_TYPE_MANUFAC = 0X05,
+ PLDM_FRU_FIELD_TYPE_MANUFAC_DATE = 0X06,
+ PLDM_FRU_FIELD_TYPE_VENDOR = 0X07,
+ PLDM_FRU_FIELD_TYPE_NAME = 0X08,
+ PLDM_FRU_FIELD_TYPE_SKU = 0X09,
+ PLDM_FRU_FIELD_TYPE_VERSION = 0X0A,
+ PLDM_FRU_FIELD_TYPE_ASSET_TAG = 0X0B,
+ PLDM_FRU_FIELD_TYPE_DESC = 0X0C,
+ PLDM_FRU_FIELD_TYPE_EC_LVL = 0X0D,
+ PLDM_FRU_FIELD_TYPE_OTHER = 0X0E,
+ PLDM_FRU_FIELD_TYPE_IANA = 0X0F,
+};
+
/** @struct pldm_get_fru_record_table_metadata_resp
*
* Structure representing PLDM get FRU table metadata response.
@@ -61,6 +99,28 @@
uint8_t fru_record_table_data[1];
} __attribute__((packed));
+/** @struct pldm_fru_record_tlv
+ *
+ * Structure representing each FRU field entry (type, length, value)
+ */
+struct pldm_fru_record_tlv {
+ uint8_t type;
+ uint8_t length;
+ uint8_t value[1];
+} __attribute__((packed));
+
+/** @struct pldm_fru_record_data_format
+ *
+ * Structure representing the FRU record data format
+ */
+struct pldm_fru_record_data_format {
+ uint16_t record_set_id;
+ uint8_t record_type;
+ uint8_t num_fru_fields;
+ uint8_t encoding_type;
+ struct pldm_fru_record_tlv tlvs[1];
+} __attribute__((packed));
+
/* Requester */
/* GetFRURecordTableMetadata */
@@ -163,6 +223,27 @@
uint8_t transfer_flag,
struct pldm_msg *msg);
+/** @brief Encode the FRU record in the FRU table
+ *
+ * @param[in/out] fru_table - Pointer to the FRU table
+ * @param[in] total_size - The size of the table,including the size of FRU
+ * record to be added to the table.
+ * @param[in/out] curr_size - The size of the table, excluding the size of FRU
+ * record to be added to the table.
+ * @param[in] record_set_id - FRU record set identifier
+ * @param[in] record_type - FRU record type
+ * @param[in] num_frus - Number of FRU fields
+ * @param[in] encoding - Encoding type for FRU fields
+ * @param[in] tlvs - Pointer to the buffer with all the FRU fields
+ * @param[in] tlvs_size - Size of the buffer with all the FRU fields
+ *
+ * @return pldm_completion_codes
+ */
+int encode_fru_record(uint8_t *fru_table, size_t total_size, size_t *curr_size,
+ uint16_t record_set_id, uint8_t record_type,
+ uint8_t num_frus, uint8_t encoding, uint8_t *tlvs,
+ size_t tlvs_size);
+
#ifdef __cplusplus
}
#endif