Lines Matching +full:tlv +full:- +full:layout
1 // SPDX-License-Identifier: GPL-2.0-only
3 * ONIE tlv NVMEM cells provider
8 * Inspired by the first layout written by: Rafał Miłecki <rafal@milecki.pl>
13 #include <linux/nvmem-consumer.h>
14 #include <linux/nvmem-provider.h>
37 return "product-name"; in onie_tlv_cell_name()
39 return "part-number"; in onie_tlv_cell_name()
41 return "serial-number"; in onie_tlv_cell_name()
43 return "mac-address"; in onie_tlv_cell_name()
45 return "manufacture-date"; in onie_tlv_cell_name()
47 return "device-version"; in onie_tlv_cell_name()
49 return "label-revision"; in onie_tlv_cell_name()
51 return "platform-name"; in onie_tlv_cell_name()
53 return "onie-version"; in onie_tlv_cell_name()
55 return "num-macs"; in onie_tlv_cell_name()
59 return "country-code"; in onie_tlv_cell_name()
63 return "diag-version"; in onie_tlv_cell_name()
65 return "service-tag"; in onie_tlv_cell_name()
67 return "vendor-extension"; in onie_tlv_cell_name()
102 struct device_node *layout; in onie_tlv_add_cells() local
103 struct onie_tlv tlv; in onie_tlv_add_cells() local
108 layout = of_nvmem_layout_get_container(nvmem); in onie_tlv_add_cells()
109 if (!layout) in onie_tlv_add_cells()
110 return -ENOENT; in onie_tlv_add_cells()
113 memcpy(&tlv, data + offset, sizeof(tlv)); in onie_tlv_add_cells()
114 if (offset + tlv.len >= data_len) { in onie_tlv_add_cells()
116 tlv.len, hdr_len + offset); in onie_tlv_add_cells()
120 cell.name = onie_tlv_cell_name(tlv.type); in onie_tlv_add_cells()
124 cell.offset = hdr_len + offset + sizeof(tlv.type) + sizeof(tlv.len); in onie_tlv_add_cells()
125 cell.bytes = tlv.len; in onie_tlv_add_cells()
126 cell.np = of_get_child_by_name(layout, cell.name); in onie_tlv_add_cells()
127 cell.read_post_process = onie_tlv_read_cb(tlv.type, data + offset + sizeof(tlv)); in onie_tlv_add_cells()
131 of_node_put(layout); in onie_tlv_add_cells()
135 offset += sizeof(tlv) + tlv.len; in onie_tlv_add_cells()
138 of_node_put(layout); in onie_tlv_add_cells()
145 if (memcmp(hdr->id, ONIE_TLV_HDR_ID, sizeof(hdr->id))) { in onie_tlv_hdr_is_valid()
150 if (hdr->version != 0x1) { in onie_tlv_hdr_is_valid()
164 memcpy(&crc_hdr, table + table_len - ONIE_TLV_CRC_FIELD_SZ, sizeof(crc_hdr)); in onie_tlv_crc_is_valid()
173 memcpy(&crc_be, table + table_len - ONIE_TLV_CRC_SZ, ONIE_TLV_CRC_SZ); in onie_tlv_crc_is_valid()
175 calc_crc = crc32(~0, table, table_len - ONIE_TLV_CRC_SZ) ^ 0xFFFFFFFF; in onie_tlv_crc_is_valid()
197 dev_err(dev, "Invalid ONIE TLV header\n"); in onie_tlv_parse_table()
198 return -EINVAL; in onie_tlv_parse_table()
205 dev_err(dev, "Invalid ONIE TLV data length\n"); in onie_tlv_parse_table()
206 return -EINVAL; in onie_tlv_parse_table()
211 return -ENOMEM; in onie_tlv_parse_table()
218 return -EINVAL; in onie_tlv_parse_table()
229 { .compatible = "onie,tlv-layout", },
235 .name = "ONIE tlv layout",
243 MODULE_DESCRIPTION("NVMEM layout driver for Onie TLV table parsing");