/src/fwupd/plugins/genesys/fu-genesys-usbhub-pd-firmware.c
Line | Count | Source |
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 | | FuFirmware parent_instance; |
16 | | }; |
17 | | |
18 | 27.9k | G_DEFINE_TYPE(FuGenesysUsbhubPdFirmware, fu_genesys_usbhub_pd_firmware, FU_TYPE_FIRMWARE) |
19 | 27.9k | |
20 | 27.9k | static gboolean |
21 | 27.9k | fu_genesys_usbhub_pd_firmware_validate(FuFirmware *firmware, |
22 | 27.9k | GInputStream *stream, |
23 | 27.9k | gsize offset, |
24 | 27.9k | GError **error) |
25 | 27.9k | { |
26 | 11.2k | return fu_struct_genesys_pd_firmware_hdr_validate_stream(stream, offset, error); |
27 | 11.2k | } |
28 | | |
29 | | static gboolean |
30 | | fu_genesys_usbhub_pd_firmware_parse(FuFirmware *firmware, |
31 | | GInputStream *stream, |
32 | | FuFirmwareParseFlags flags, |
33 | | GError **error) |
34 | 10.6k | { |
35 | 10.6k | gsize code_size = 0; |
36 | 10.6k | g_autoptr(GInputStream) stream_trunc = NULL; |
37 | | |
38 | 10.6k | fu_firmware_set_id(firmware, fu_genesys_fw_type_to_string(FU_GENESYS_FW_TYPE_PD)); |
39 | 10.6k | fu_firmware_set_idx(firmware, FU_GENESYS_FW_TYPE_PD); |
40 | 10.6k | fu_firmware_set_alignment(firmware, FU_FIRMWARE_ALIGNMENT_1K); |
41 | | |
42 | | /* truncate to correct size */ |
43 | 10.6k | if (!fu_genesys_usbhub_firmware_calculate_size(stream, &code_size, error)) { |
44 | 45 | g_prefix_error_literal(error, "not valid for pd: "); |
45 | 45 | return FALSE; |
46 | 45 | } |
47 | 10.6k | stream_trunc = fu_partial_input_stream_new(stream, 0x0, code_size, error); |
48 | 10.6k | if (stream_trunc == NULL) |
49 | 113 | return FALSE; |
50 | 10.5k | if (!fu_firmware_set_stream(firmware, stream_trunc, error)) |
51 | 0 | return FALSE; |
52 | | |
53 | | /* calculate checksum */ |
54 | 10.5k | if ((flags & FU_FIRMWARE_PARSE_FLAG_IGNORE_CHECKSUM) == 0) { |
55 | 4.98k | if (!fu_genesys_usbhub_firmware_verify_checksum(stream_trunc, error)) { |
56 | 112 | g_prefix_error_literal(error, "not valid for pd: "); |
57 | 112 | return FALSE; |
58 | 112 | } |
59 | 4.98k | } |
60 | | |
61 | | /* get firmware version */ |
62 | 10.4k | if (!fu_genesys_usbhub_firmware_ensure_version(firmware, error)) { |
63 | 0 | g_prefix_error_literal(error, "not valid for pd: "); |
64 | 0 | return FALSE; |
65 | 0 | } |
66 | | |
67 | | /* success */ |
68 | 10.4k | return TRUE; |
69 | 10.4k | } |
70 | | |
71 | | static void |
72 | | fu_genesys_usbhub_pd_firmware_init(FuGenesysUsbhubPdFirmware *self) |
73 | 11.2k | { |
74 | 11.2k | fu_firmware_add_flag(FU_FIRMWARE(self), FU_FIRMWARE_FLAG_HAS_CHECKSUM); |
75 | 11.2k | } |
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 | } |