Lines Matching +full:multi +full:-

1 /*-
2 * SPDX-License-Identifier: BSD-3-Clause
4 * Copyright (c) 2017-2019 Mellanox Technologies.
37 #include <contrib/xz-embedded/linux/include/linux/xz.h>
46 * +----------------------------------+
48 * +----------------------------------+
50 * | +------------------------------+ | +-----------------+
51 * | | package descriptor tlv +-----> |num_devices=n |
52 * | +------------------------------+ | |num_components=m |
53 * +----------------------------------+ |CB offset |
55 * | +------------------------------+ | | |
56 * | | PSID tlv | | +-----------------+
57 * | +------------------------------+ |
59 * | +------------------------------+ |
60 * +----------------------------------+
62 * | +------------------------------+ | +-----------------+
63 * | | component descriptor tlv +-----> |Among others: |
64 * | +------------------------------+ | |CB offset=o |
65 * +----------------------------------+ |comp index=i |
68 * | | +-----------------+
73 * +----------------------------------+
76 * - Fingerprint
77 * - Several multi_tlvs (TLVs of type MLXFW_MFA2_TLV_MULTI, as defined in
79 * - Compresses content block
82 * -------------------
83 * The first multi TLV is treated as package descriptor, and expected to have a
87 * multi TLV.
90 * -------------------------------
91 * The multi TLVs following the package descriptor are treated as device
93 * - PSID TLV child of type MLXFW_MFA2_TLV_PSID containing that device PSID.
94 * - Component index of type MLXFW_MFA2_TLV_COMPONENT_PTR that contains that
98 * ----------------------------------
99 * The multi TLVs following the device descriptor multi TLVs are treated as
108 sizeof(mlxfw_mfa2_fingerprint) - 1;
111 static const int mlxfw_mfa2_comp_magic_len = sizeof(mlxfw_mfa2_comp_magic) - 1;
115 if (fw->datasize < sizeof(mlxfw_mfa2_fingerprint)) in mlxfw_mfa2_check()
118 return memcmp(fw->data, mlxfw_mfa2_fingerprint, in mlxfw_mfa2_check()
124 const struct mlxfw_mfa2_tlv_multi *multi) in mlxfw_mfa2_tlv_multi_validate() argument
130 mlxfw_mfa2_tlv_multi_foreach(mfa2_file, tlv, idx, multi) { in mlxfw_mfa2_tlv_multi_validate()
132 pr_err("Multi has invalid child"); in mlxfw_mfa2_tlv_multi_validate()
145 const struct mlxfw_mfa2_tlv_multi *multi; in mlxfw_mfa2_file_dev_validate() local
154 multi = mlxfw_mfa2_tlv_multi_get(mfa2_file, dev_tlv); in mlxfw_mfa2_file_dev_validate()
155 if (!multi) { in mlxfw_mfa2_file_dev_validate()
160 if (!mlxfw_mfa2_tlv_multi_validate(mfa2_file, multi)) in mlxfw_mfa2_file_dev_validate()
164 tlv = mlxfw_mfa2_tlv_multi_child_find(mfa2_file, multi, in mlxfw_mfa2_file_dev_validate()
177 print_hex_dump_debug(" -- Device PSID ", DUMP_PREFIX_NONE, 16, 16, in mlxfw_mfa2_file_dev_validate()
178 psid->psid, be16_to_cpu(tlv->len), true); in mlxfw_mfa2_file_dev_validate()
181 err = mlxfw_mfa2_tlv_multi_child_count(mfa2_file, multi, in mlxfw_mfa2_file_dev_validate()
193 tlv = mlxfw_mfa2_tlv_multi_child_find(mfa2_file, multi, in mlxfw_mfa2_file_dev_validate()
206 pr_debug(" -- Component index %d\n", in mlxfw_mfa2_file_dev_validate()
207 be16_to_cpu(cptr->component_index)); in mlxfw_mfa2_file_dev_validate()
218 const struct mlxfw_mfa2_tlv_multi *multi; in mlxfw_mfa2_file_comp_validate() local
223 multi = mlxfw_mfa2_tlv_multi_get(mfa2_file, comp_tlv); in mlxfw_mfa2_file_comp_validate()
224 if (!multi) { in mlxfw_mfa2_file_comp_validate()
229 if (!mlxfw_mfa2_tlv_multi_validate(mfa2_file, multi)) in mlxfw_mfa2_file_comp_validate()
233 tlv = mlxfw_mfa2_tlv_multi_child(mfa2_file, multi); in mlxfw_mfa2_file_comp_validate()
235 pr_err("Component descriptor %d multi TLV error\n", comp_idx); in mlxfw_mfa2_file_comp_validate()
245 pr_debug(" -- Component type %d\n", be16_to_cpu(cdesc->identifier)); in mlxfw_mfa2_file_comp_validate()
246 pr_debug(" -- Offset %#jx and size %d\n", in mlxfw_mfa2_file_comp_validate()
247 (uintmax_t)((u64) be32_to_cpu(cdesc->cb_offset_h) << 32) in mlxfw_mfa2_file_comp_validate()
248 | be32_to_cpu(cdesc->cb_offset_l), be32_to_cpu(cdesc->size)); in mlxfw_mfa2_file_comp_validate()
261 mlxfw_mfa2_tlv_foreach(mfa2_file, tlv, idx, mfa2_file->first_dev, in mlxfw_mfa2_file_validate()
262 mfa2_file->dev_count) { in mlxfw_mfa2_file_validate()
274 mlxfw_mfa2_tlv_foreach(mfa2_file, tlv, idx, mfa2_file->first_component, in mlxfw_mfa2_file_validate()
275 mfa2_file->component_count) { in mlxfw_mfa2_file_validate()
291 const struct mlxfw_mfa2_tlv_multi *multi; in mlxfw_mfa2_file_init() local
300 return ERR_PTR(-ENOMEM); in mlxfw_mfa2_file_init()
302 mfa2_file->fw = fw; in mlxfw_mfa2_file_init()
303 first_tlv_ptr = (const u8 *) fw->data + NLA_ALIGN(mlxfw_mfa2_fingerprint_len); in mlxfw_mfa2_file_init()
310 multi = mlxfw_mfa2_tlv_multi_get(mfa2_file, first_tlv); in mlxfw_mfa2_file_init()
311 if (!multi) { in mlxfw_mfa2_file_init()
312 pr_err("First TLV is not of valid multi type\n"); in mlxfw_mfa2_file_init()
316 multi_child = mlxfw_mfa2_tlv_multi_child(mfa2_file, multi); in mlxfw_mfa2_file_init()
326 mfa2_file->first_dev = mlxfw_mfa2_tlv_next(mfa2_file, first_tlv); in mlxfw_mfa2_file_init()
327 if (!mfa2_file->first_dev) { in mlxfw_mfa2_file_init()
332 mfa2_file->dev_count = be16_to_cpu(pd->num_devices); in mlxfw_mfa2_file_init()
333 mfa2_file->first_component = mlxfw_mfa2_tlv_advance(mfa2_file, in mlxfw_mfa2_file_init()
334 mfa2_file->first_dev, in mlxfw_mfa2_file_init()
335 mfa2_file->dev_count); in mlxfw_mfa2_file_init()
336 mfa2_file->component_count = be16_to_cpu(pd->num_components); in mlxfw_mfa2_file_init()
337 mfa2_file->cb = (const u8 *) fw->data + NLA_ALIGN(be32_to_cpu(pd->cb_offset)); in mlxfw_mfa2_file_init()
338 if (!mlxfw_mfa2_valid_ptr(mfa2_file, mfa2_file->cb)) { in mlxfw_mfa2_file_init()
342 mfa2_file->cb_archive_size = be32_to_cpu(pd->cb_archive_size); in mlxfw_mfa2_file_init()
343 cb_top_ptr = (const u8 *) mfa2_file->cb + mfa2_file->cb_archive_size - 1; in mlxfw_mfa2_file_init()
354 return ERR_PTR(-EINVAL); in mlxfw_mfa2_file_init()
368 mlxfw_mfa2_tlv_foreach(mfa2_file, dev_tlv, idx, mfa2_file->first_dev, in mlxfw_mfa2_tlv_dev_get()
369 mfa2_file->dev_count) { in mlxfw_mfa2_tlv_dev_get()
382 if (be16_to_cpu(tlv->len) != psid_size) in mlxfw_mfa2_tlv_dev_get()
389 if (memcmp(psid, tlv_psid->psid, psid_size) == 0) in mlxfw_mfa2_tlv_dev_get()
406 return -EINVAL; in mlxfw_mfa2_file_component_count()
434 return -ENOMEM; in mlxfw_mfa2_xz_dec_run()
437 return -EINVAL; in mlxfw_mfa2_xz_dec_run()
440 return -EINVAL; in mlxfw_mfa2_xz_dec_run()
443 return -EINVAL; in mlxfw_mfa2_xz_dec_run()
446 return -EINVAL; in mlxfw_mfa2_xz_dec_run()
449 return -EINVAL; in mlxfw_mfa2_xz_dec_run()
462 xz_dec = xz_dec_init(XZ_DYNALLOC, (u32) -1); in mlxfw_mfa2_file_cb_offset_xz()
464 return -EINVAL; in mlxfw_mfa2_file_cb_offset_xz()
466 dec_buf.in_size = mfa2_file->cb_archive_size; in mlxfw_mfa2_file_cb_offset_xz()
467 dec_buf.in = mfa2_file->cb; in mlxfw_mfa2_file_cb_offset_xz()
474 dec_buf.out_size = min_t(size_t, size, off - curr_off); in mlxfw_mfa2_file_cb_offset_xz()
483 err = -EINVAL; in mlxfw_mfa2_file_cb_offset_xz()
502 const struct mlxfw_mfa2_tlv_multi *multi; in mlxfw_mfa2_file_component_tlv_get() local
506 if (comp_index > mfa2_file->component_count) in mlxfw_mfa2_file_component_tlv_get()
509 comp_tlv = mlxfw_mfa2_tlv_advance(mfa2_file, mfa2_file->first_component, in mlxfw_mfa2_file_component_tlv_get()
514 multi = mlxfw_mfa2_tlv_multi_get(mfa2_file, comp_tlv); in mlxfw_mfa2_file_component_tlv_get()
515 if (!multi) in mlxfw_mfa2_file_component_tlv_get()
518 multi_child = mlxfw_mfa2_tlv_multi_child(mfa2_file, multi); in mlxfw_mfa2_file_component_tlv_get()
554 comp_idx = be16_to_cpu(cptr->component_index); in mlxfw_mfa2_file_component_find()
573 return ERR_PTR(-EINVAL); in mlxfw_mfa2_file_component_get()
575 cb_offset = (u64) be32_to_cpu(comp->cb_offset_h) << 32 | in mlxfw_mfa2_file_component_get()
576 be32_to_cpu(comp->cb_offset_l); in mlxfw_mfa2_file_component_get()
577 comp_size = be32_to_cpu(comp->size); in mlxfw_mfa2_file_component_get()
582 return ERR_PTR(-ENOMEM); in mlxfw_mfa2_file_component_get()
583 comp_data->comp.data_size = comp_size; in mlxfw_mfa2_file_component_get()
584 comp_data->comp.index = be16_to_cpu(comp->identifier); in mlxfw_mfa2_file_component_get()
586 comp_data->buff); in mlxfw_mfa2_file_component_get()
592 if (memcmp(comp_data->buff, mlxfw_mfa2_comp_magic, in mlxfw_mfa2_file_component_get()
595 err = -EINVAL; in mlxfw_mfa2_file_component_get()
599 comp_data->comp.data = comp_data->buff + mlxfw_mfa2_comp_magic_len; in mlxfw_mfa2_file_component_get()
600 return &comp_data->comp; in mlxfw_mfa2_file_component_get()