/src/fwupd/plugins/genesys/fu-genesys-usbhub-pd-firmware.c
Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | * Copyright 2023 Adam.Chen <Adam.Chen@genesyslogic.com.tw> |
3 | | * |
4 | | * SPDX-License-Identifier: LGPL-2.1-or-later |
5 | | */ |
6 | | |
7 | | #include "config.h" |
8 | | |
9 | | #include "fu-genesys-common.h" |
10 | | #include "fu-genesys-usbhub-firmware.h" |
11 | | #include "fu-genesys-usbhub-pd-firmware.h" |
12 | | #include "fu-genesys-usbhub-struct.h" |
13 | | |
14 | | struct _FuGenesysUsbhubPdFirmware { |
15 | | FuFirmwareClass parent_instance; |
16 | | }; |
17 | | |
18 | | G_DEFINE_TYPE(FuGenesysUsbhubPdFirmware, fu_genesys_usbhub_pd_firmware, FU_TYPE_FIRMWARE) |
19 | | |
20 | | static gboolean |
21 | | fu_genesys_usbhub_pd_firmware_validate(FuFirmware *firmware, |
22 | | GInputStream *stream, |
23 | | gsize offset, |
24 | | GError **error) |
25 | 10.0k | { |
26 | 10.0k | return fu_struct_genesys_pd_firmware_hdr_validate_stream(stream, offset, error); |
27 | 10.0k | } |
28 | | |
29 | | static gboolean |
30 | | fu_genesys_usbhub_pd_firmware_parse(FuFirmware *firmware, |
31 | | GInputStream *stream, |
32 | | FuFirmwareParseFlags flags, |
33 | | GError **error) |
34 | 9.48k | { |
35 | 9.48k | gsize code_size = 0; |
36 | 9.48k | g_autoptr(GInputStream) stream_trunc = NULL; |
37 | | |
38 | 9.48k | fu_firmware_set_id(firmware, fu_genesys_fw_type_to_string(FU_GENESYS_FW_TYPE_PD)); |
39 | 9.48k | fu_firmware_set_idx(firmware, FU_GENESYS_FW_TYPE_PD); |
40 | 9.48k | fu_firmware_set_alignment(firmware, FU_FIRMWARE_ALIGNMENT_1K); |
41 | | |
42 | | /* truncate to correct size */ |
43 | 9.48k | if (!fu_genesys_usbhub_firmware_calculate_size(stream, &code_size, error)) { |
44 | 34 | g_prefix_error(error, "not valid for pd: "); |
45 | 34 | return FALSE; |
46 | 34 | } |
47 | 9.44k | stream_trunc = fu_partial_input_stream_new(stream, 0x0, code_size, error); |
48 | 9.44k | if (stream_trunc == NULL) |
49 | 109 | return FALSE; |
50 | 9.33k | if (!fu_firmware_set_stream(firmware, stream_trunc, error)) |
51 | 0 | return FALSE; |
52 | | |
53 | | /* calculate checksum */ |
54 | 9.33k | if ((flags & FU_FIRMWARE_PARSE_FLAG_IGNORE_CHECKSUM) == 0) { |
55 | 4.50k | if (!fu_genesys_usbhub_firmware_verify_checksum(stream_trunc, error)) { |
56 | 103 | g_prefix_error(error, "not valid for pd: "); |
57 | 103 | return FALSE; |
58 | 103 | } |
59 | 4.50k | } |
60 | | |
61 | | /* get firmware version */ |
62 | 9.23k | if (!fu_genesys_usbhub_firmware_ensure_version(firmware, error)) { |
63 | 0 | g_prefix_error(error, "not valid for pd: "); |
64 | 0 | return FALSE; |
65 | 0 | } |
66 | | |
67 | | /* success */ |
68 | 9.23k | return TRUE; |
69 | 9.23k | } |
70 | | |
71 | | static void |
72 | | fu_genesys_usbhub_pd_firmware_init(FuGenesysUsbhubPdFirmware *self) |
73 | 10.0k | { |
74 | 10.0k | fu_firmware_add_flag(FU_FIRMWARE(self), FU_FIRMWARE_FLAG_HAS_CHECKSUM); |
75 | 10.0k | } |
76 | | |
77 | | static void |
78 | | fu_genesys_usbhub_pd_firmware_class_init(FuGenesysUsbhubPdFirmwareClass *klass) |
79 | 1 | { |
80 | 1 | FuFirmwareClass *firmware_class = FU_FIRMWARE_CLASS(klass); |
81 | 1 | firmware_class->validate = fu_genesys_usbhub_pd_firmware_validate; |
82 | 1 | firmware_class->parse = fu_genesys_usbhub_pd_firmware_parse; |
83 | 1 | } |