mirror of
https://git.proxmox.com/git/fwupd
synced 2025-08-07 08:39:48 +00:00
trivial: Add yet another version encoding
This variant is a quad-style, but with the Microsoft style 4 digit BuildVer.
This commit is contained in:
parent
ce4a1a8ba6
commit
89ab873f72
58
docs/version-format.md
Normal file
58
docs/version-format.md
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
Version Formats
|
||||||
|
===============
|
||||||
|
|
||||||
|
In some circumstances fwupd has to convert from a unsigned integer version
|
||||||
|
number into something that has either been used in documentation or has been
|
||||||
|
defined in some specification.
|
||||||
|
A good example here is the UEFI ESRT table, which specifies a `uint32_t` for
|
||||||
|
the version but does not specify how this should be formatted for the user.
|
||||||
|
|
||||||
|
As is typical in underspecified specifications, vendors have converted the
|
||||||
|
integer in different ways. For instance, Dell uses version strings like 1.2.3
|
||||||
|
and Microsoft use versions like 1.2.3.4.
|
||||||
|
|
||||||
|
The fwudp daemon can match specific devices and apply the correct version style
|
||||||
|
using quirk files. The version format can also be specified in the firmware
|
||||||
|
`metainfo.xml` file so that the new version is correctly shown, and so that it
|
||||||
|
matches on the LVFS website.
|
||||||
|
|
||||||
|
The current version formats supported by fwupd and the LVFS are:
|
||||||
|
|
||||||
|
* `plain`: Use plain integer version numbers with no dots, e.g. `AABBCCDD`
|
||||||
|
* `quad`: Use Dell-style `AA.BB.CC.DD` version numbers
|
||||||
|
* `triplet`: Use Microsoft-style `AA.BB.CCDD` version numbers
|
||||||
|
* `pair`: Use two `AABB.CCDD` version numbers
|
||||||
|
* `bcd`: Use binary coded decimal notation
|
||||||
|
* `intel-me`: Use Intel ME-style notation (`aaa+11.bbbbb.CC.DDDD`)
|
||||||
|
* `intel-me2`: Use alternate Intel ME-style-style `A.B.CC.DDDD` notation
|
||||||
|
|
||||||
|
These can be specified in quirk files like this:
|
||||||
|
|
||||||
|
# Vendor Modelname
|
||||||
|
[Guid=5b92717b-2cad-4a96-a13b-9d65781df8bf]
|
||||||
|
VersionFormat = intel-me2
|
||||||
|
|
||||||
|
...or in metainfo.xml files like this:
|
||||||
|
|
||||||
|
<custom>
|
||||||
|
<value key="LVFS::VersionFormat">intel-me2</value>
|
||||||
|
</custom>
|
||||||
|
|
||||||
|
Runtime requirements
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
Versions of fwupd `< 1.2.0` can only support firmware updates with key values
|
||||||
|
`LVFS::VersionFormat` of `quad` and `triplet`. Additionally, on older versions
|
||||||
|
no quirk `VersionFormat` device fixups are supported.
|
||||||
|
|
||||||
|
If want to use one of the additional version formats you should depend on a
|
||||||
|
specific version of fwupd in the firmware file:
|
||||||
|
|
||||||
|
<requires>
|
||||||
|
<id compare="ge" version="1.2.0">org.freedesktop.fwupd</id>
|
||||||
|
</requires>
|
||||||
|
|
||||||
|
This is not *strictly* required, as the integer value can be used for update
|
||||||
|
calculations if the version is specified in hex (e.g. `0x12345678`) in the
|
||||||
|
`<release>` tag, although the user might get a bit confused if the update
|
||||||
|
version does not match the update description.
|
@ -33,6 +33,8 @@ fu_common_version_format_from_string (const gchar *str)
|
|||||||
return FU_VERSION_FORMAT_TRIPLET;
|
return FU_VERSION_FORMAT_TRIPLET;
|
||||||
if (g_strcmp0 (str, "quad") == 0)
|
if (g_strcmp0 (str, "quad") == 0)
|
||||||
return FU_VERSION_FORMAT_QUAD;
|
return FU_VERSION_FORMAT_QUAD;
|
||||||
|
if (g_strcmp0 (str, "intel-me2") == 0)
|
||||||
|
return FU_VERSION_FORMAT_INTEL_ME2;
|
||||||
if (g_strcmp0 (str, "bcd") == 0)
|
if (g_strcmp0 (str, "bcd") == 0)
|
||||||
return FU_VERSION_FORMAT_BCD;
|
return FU_VERSION_FORMAT_BCD;
|
||||||
if (g_strcmp0 (str, "plain") == 0)
|
if (g_strcmp0 (str, "plain") == 0)
|
||||||
@ -59,6 +61,8 @@ fu_common_version_format_to_string (FuVersionFormat kind)
|
|||||||
return "triplet";
|
return "triplet";
|
||||||
if (kind == FU_VERSION_FORMAT_QUAD)
|
if (kind == FU_VERSION_FORMAT_QUAD)
|
||||||
return "quad";
|
return "quad";
|
||||||
|
if (kind == FU_VERSION_FORMAT_INTEL_ME2)
|
||||||
|
return "intel-me2";
|
||||||
if (kind == FU_VERSION_FORMAT_BCD)
|
if (kind == FU_VERSION_FORMAT_BCD)
|
||||||
return "bcd";
|
return "bcd";
|
||||||
if (kind == FU_VERSION_FORMAT_PLAIN)
|
if (kind == FU_VERSION_FORMAT_PLAIN)
|
||||||
@ -123,6 +127,14 @@ fu_common_version_from_uint32 (guint32 val, FuVersionFormat kind)
|
|||||||
(val >> 16) & 0xff,
|
(val >> 16) & 0xff,
|
||||||
val & 0xffff);
|
val & 0xffff);
|
||||||
}
|
}
|
||||||
|
if (kind == FU_VERSION_FORMAT_INTEL_ME2) {
|
||||||
|
/* A.B.CC.DDDD */
|
||||||
|
return g_strdup_printf ("%u.%u.%u.%u",
|
||||||
|
(val >> 28) & 0x0f,
|
||||||
|
(val >> 24) & 0x0f,
|
||||||
|
(val >> 16) & 0xff,
|
||||||
|
val & 0xffff);
|
||||||
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -17,7 +17,8 @@
|
|||||||
* @FU_VERSION_FORMAT_TRIPLET: Use Microsoft-style AA.BB.CCDD version numbers
|
* @FU_VERSION_FORMAT_TRIPLET: Use Microsoft-style AA.BB.CCDD version numbers
|
||||||
* @FU_VERSION_FORMAT_PAIR: Use two AABB.CCDD version numbers
|
* @FU_VERSION_FORMAT_PAIR: Use two AABB.CCDD version numbers
|
||||||
* @FU_VERSION_FORMAT_BCD: Use binary coded decimal notation
|
* @FU_VERSION_FORMAT_BCD: Use binary coded decimal notation
|
||||||
* @FU_VERSION_FORMAT_INTEL_ME: Use Intel ME-style notation
|
* @FU_VERSION_FORMAT_INTEL_ME: Use Intel ME-style bitshifted notation
|
||||||
|
* @FU_VERSION_FORMAT_INTEL_ME2: Use Intel ME-style A.B.CC.DDDD notation notation
|
||||||
*
|
*
|
||||||
* The flags used when parsing version numbers.
|
* The flags used when parsing version numbers.
|
||||||
**/
|
**/
|
||||||
@ -29,6 +30,7 @@ typedef enum {
|
|||||||
FU_VERSION_FORMAT_PAIR, /* Since: 1.2.0 */
|
FU_VERSION_FORMAT_PAIR, /* Since: 1.2.0 */
|
||||||
FU_VERSION_FORMAT_BCD, /* Since: 1.2.0 */
|
FU_VERSION_FORMAT_BCD, /* Since: 1.2.0 */
|
||||||
FU_VERSION_FORMAT_INTEL_ME, /* Since: 1.2.0 */
|
FU_VERSION_FORMAT_INTEL_ME, /* Since: 1.2.0 */
|
||||||
|
FU_VERSION_FORMAT_INTEL_ME2, /* Since: 1.2.0 */
|
||||||
/*< private >*/
|
/*< private >*/
|
||||||
FU_VERSION_FORMAT_LAST
|
FU_VERSION_FORMAT_LAST
|
||||||
} FuVersionFormat;
|
} FuVersionFormat;
|
||||||
|
@ -2961,6 +2961,8 @@ fu_common_version_func (void)
|
|||||||
{ 0xff000100, "4278190336", FU_VERSION_FORMAT_PLAIN },
|
{ 0xff000100, "4278190336", FU_VERSION_FORMAT_PLAIN },
|
||||||
{ 0x0, "11.0.0.0", FU_VERSION_FORMAT_INTEL_ME },
|
{ 0x0, "11.0.0.0", FU_VERSION_FORMAT_INTEL_ME },
|
||||||
{ 0xffffffff, "18.31.255.65535", FU_VERSION_FORMAT_INTEL_ME },
|
{ 0xffffffff, "18.31.255.65535", FU_VERSION_FORMAT_INTEL_ME },
|
||||||
|
{ 0x0b32057a, "11.11.50.1402", FU_VERSION_FORMAT_INTEL_ME },
|
||||||
|
{ 0xb8320d84, "11.8.50.3460", FU_VERSION_FORMAT_INTEL_ME2 },
|
||||||
{ 0, NULL }
|
{ 0, NULL }
|
||||||
};
|
};
|
||||||
struct {
|
struct {
|
||||||
|
Loading…
Reference in New Issue
Block a user