mirror of
https://git.proxmox.com/git/fwupd
synced 2025-07-27 09:46:25 +00:00
dell-dock: Add initial support for USB4 module
This commit is contained in:
parent
d46bdb3788
commit
9264dc1bca
@ -47,6 +47,7 @@ These devices use several different generation schemes, e.g.
|
||||
* Update Level: `USB\VID_413C&PID_B06E&hub&status`
|
||||
* MST Hub: `MST-panamera-vmm5331-259`
|
||||
* Thunderbolt Controller: `TBT-00d4b070`
|
||||
* USB4 Controller: `TBT-00d4b071`
|
||||
|
||||
Update Behavior
|
||||
---------------
|
||||
|
@ -63,7 +63,6 @@ Icon = dock-usb
|
||||
FirmwareSizeMin = 0x1FFC0
|
||||
FirmwareSizeMax = 0x20000
|
||||
Flags = require-ac,dual-image,self-recovery,usable-during-update
|
||||
Children = FuDellDockStatus|USB\VID_413C&PID_B06E&hub&status,FuDellDockMst|MST-panamera-vmm5331-259
|
||||
DellDockUnlockTarget = 1
|
||||
DellDockBoardMin = 6
|
||||
DellDockVersionLowest = 01.00.00.00
|
||||
@ -81,6 +80,17 @@ FirmwareSize = 24
|
||||
InstallDuration = 5
|
||||
DellDockBlobVersionOffset = 0x14
|
||||
|
||||
# Representation of overall dock update
|
||||
[USB\VID_413C&PID_B06E&hub&salomon_mlk_status]
|
||||
Name = Package level of Dell dock
|
||||
Summary = A representation of dock update status
|
||||
Plugin = dell_dock
|
||||
Vendor = Dell Inc.
|
||||
Flags = self-recovery,usable-during-update
|
||||
FirmwareSize = 24
|
||||
InstallDuration = 5
|
||||
DellDockBlobVersionOffset = 0x14
|
||||
|
||||
# MST Hub
|
||||
[MST-panamera-vmm5331-259]
|
||||
Name = VMM5331 in Dell dock
|
||||
@ -115,3 +125,16 @@ DellDockUnlockTarget = 10
|
||||
DellDockHubVersionLowest = 1.31
|
||||
DellDockBlobMajorOffset = 0x400a
|
||||
DellDockBlobMinorOffset = 0x4009
|
||||
|
||||
# USB4 controller
|
||||
[TBT-00d4b071]
|
||||
Name = USB4 controller in Dell dock
|
||||
Summary = USB4 controller
|
||||
Vendor = Dell Inc.
|
||||
VendorId = TBT:0x00D4
|
||||
ParentGuid = USB\VID_413C&PID_B06E&hub&embedded
|
||||
FirmwareSizeMin=0x40000
|
||||
FirmwareSizeMax=0x80000
|
||||
Flags = skips-restart,require-ac,dual-image
|
||||
Icon = thunderbolt
|
||||
InstallDuration = 46
|
||||
|
@ -106,6 +106,7 @@ typedef enum {
|
||||
MODULE_TYPE_130_UNIVERSAL,
|
||||
MODULE_TYPE_240_TRIN,
|
||||
MODULE_TYPE_210_DUAL,
|
||||
MODULE_TYPE_130_USB4,
|
||||
} FuDellDockDockModule;
|
||||
|
||||
typedef struct __attribute__ ((packed)) {
|
||||
@ -176,6 +177,13 @@ fu_dell_dock_ec_set_board (FuDevice *device)
|
||||
fu_device_set_summary (device, summary);
|
||||
}
|
||||
|
||||
gboolean
|
||||
fu_dell_dock_module_is_usb4 (FuDevice *device)
|
||||
{
|
||||
FuDellDockEc *self = FU_DELL_DOCK_EC (device);
|
||||
return self->data->module_type == MODULE_TYPE_130_USB4;
|
||||
}
|
||||
|
||||
const gchar *
|
||||
fu_dell_dock_ec_get_module_type (FuDevice *device)
|
||||
{
|
||||
@ -195,6 +203,8 @@ fu_dell_dock_ec_get_module_type (FuDevice *device)
|
||||
return "240 (Trinity)";
|
||||
case MODULE_TYPE_210_DUAL:
|
||||
return "210 (Dual)";
|
||||
case MODULE_TYPE_130_USB4:
|
||||
return "130 (TBT4)";
|
||||
default:
|
||||
return "unknown";
|
||||
}
|
||||
@ -421,7 +431,8 @@ fu_dell_dock_ec_get_dock_info (FuDevice *device,
|
||||
g_debug ("\tParsed version %s", self->mst_version);
|
||||
} else if (map->device_type == FU_DELL_DOCK_DEVICETYPE_TBT &&
|
||||
(self->data->module_type == MODULE_TYPE_130_TBT ||
|
||||
self->data->module_type == MODULE_TYPE_45_TBT)) {
|
||||
self->data->module_type == MODULE_TYPE_45_TBT ||
|
||||
self->data->module_type == MODULE_TYPE_130_USB4)) {
|
||||
/* guard against invalid Thunderbolt version read from EC */
|
||||
if (!fu_dell_dock_test_valid_byte (device_entry[i].version.version_8, 2)) {
|
||||
g_warning ("[EC bug] EC read invalid Thunderbolt version %08x",
|
||||
@ -455,24 +466,12 @@ fu_dell_dock_ec_get_dock_info (FuDevice *device,
|
||||
|
||||
/* Thunderbolt SKU takes a little longer */
|
||||
if (self->data->module_type == MODULE_TYPE_130_TBT ||
|
||||
self->data->module_type == MODULE_TYPE_45_TBT) {
|
||||
self->data->module_type == MODULE_TYPE_45_TBT ||
|
||||
self->data->module_type == MODULE_TYPE_130_USB4) {
|
||||
guint64 tmp = fu_device_get_install_duration (device);
|
||||
fu_device_set_install_duration (device, tmp + 20);
|
||||
}
|
||||
|
||||
/* minimum EC version this code will support */
|
||||
if (fu_common_vercmp_full (self->ec_version,
|
||||
self->ec_minimum_version,
|
||||
FWUPD_VERSION_FORMAT_QUAD) < 0) {
|
||||
g_set_error (error, FWUPD_ERROR, FWUPD_ERROR_NOT_SUPPORTED,
|
||||
"dock containing EC version %s is not supported",
|
||||
self->ec_version);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
fu_device_set_version_lowest (device, self->ec_minimum_version);
|
||||
|
||||
|
||||
/* Determine if the passive flow should be used when flashing */
|
||||
hub_version = fu_device_get_version (fu_device_get_proxy (device));
|
||||
if (fu_common_vercmp_full (hub_version, "1.42", FWUPD_VERSION_FORMAT_PAIR) < 0) {
|
||||
@ -782,10 +781,24 @@ fu_dell_dock_ec_write_fw (FuDevice *device,
|
||||
return FALSE;
|
||||
data = g_bytes_get_data (fw, &fw_size);
|
||||
write_size = (fw_size / HIDI2C_MAX_WRITE) >= 1 ? HIDI2C_MAX_WRITE : fw_size;
|
||||
|
||||
dynamic_version = g_strndup ((gchar *) data + self->blob_version_offset, 11);
|
||||
g_debug ("writing EC firmware version %s", dynamic_version);
|
||||
|
||||
/* meet the minimum EC version */
|
||||
if ((flags & FWUPD_INSTALL_FLAG_FORCE) == 0 &&
|
||||
(self->data->module_type != MODULE_TYPE_130_USB4) &&
|
||||
(fu_common_vercmp_full (dynamic_version,
|
||||
self->ec_minimum_version,
|
||||
FWUPD_VERSION_FORMAT_QUAD) < 0)) {
|
||||
g_set_error (error,
|
||||
FWUPD_ERROR,
|
||||
FWUPD_ERROR_NOT_SUPPORTED,
|
||||
"New EC version %s is less than minimum required %s",
|
||||
dynamic_version,
|
||||
self->ec_minimum_version);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
g_debug ("writing EC firmware version %s", dynamic_version);
|
||||
if (!fu_dell_dock_ec_modify_lock (device, self->unlock_target, TRUE, error))
|
||||
return FALSE;
|
||||
|
||||
|
@ -41,3 +41,4 @@ guint32 fu_dell_dock_ec_get_status_version (FuDevice *device);
|
||||
gboolean fu_dell_dock_ec_commit_package (FuDevice *device,
|
||||
GBytes *blob_fw,
|
||||
GError **error);
|
||||
gboolean fu_dell_dock_module_is_usb4 (FuDevice *device);
|
||||
|
@ -68,15 +68,40 @@ fu_plugin_dell_dock_probe (FuPlugin *plugin,
|
||||
FuDevice *proxy,
|
||||
GError **error)
|
||||
{
|
||||
const gchar* instance;
|
||||
g_autoptr(FuDellDockEc) ec_device = NULL;
|
||||
g_autoptr(FuDellDockMst) mst_device = NULL;
|
||||
g_autoptr(FuDellDockStatus) status_device = NULL;
|
||||
|
||||
/* create all static endpoints */
|
||||
/* create ec endpoint */
|
||||
ec_device = fu_dell_dock_ec_new (proxy);
|
||||
if (!fu_plugin_dell_dock_create_node (plugin,
|
||||
FU_DEVICE (ec_device),
|
||||
error))
|
||||
return FALSE;
|
||||
|
||||
/* create mst endpoint */
|
||||
mst_device = fu_dell_dock_mst_new ();
|
||||
fu_device_add_child (FU_DEVICE (ec_device), FU_DEVICE (mst_device));
|
||||
fu_device_add_instance_id (FU_DEVICE (mst_device), "MST-panamera-vmm5331-259");
|
||||
if (!fu_plugin_dell_dock_create_node (plugin,
|
||||
FU_DEVICE (mst_device),
|
||||
error))
|
||||
return FALSE;
|
||||
|
||||
/* create package version endpoint */
|
||||
status_device = fu_dell_dock_status_new ();
|
||||
if (fu_dell_dock_module_is_usb4 (FU_DEVICE (ec_device)))
|
||||
instance = "USB\\VID_413C&PID_B06E&hub&salomon_mlk_status";
|
||||
else
|
||||
instance = "USB\\VID_413C&PID_B06E&hub&status";
|
||||
fu_device_add_child (FU_DEVICE (ec_device), FU_DEVICE (status_device));
|
||||
fu_device_add_instance_id (FU_DEVICE (status_device), instance);
|
||||
if (!fu_plugin_dell_dock_create_node (plugin,
|
||||
FU_DEVICE (status_device),
|
||||
error))
|
||||
return FALSE;
|
||||
|
||||
/* create TBT endpoint if Thunderbolt SKU and Thunderbolt link inactive */
|
||||
if (fu_dell_dock_ec_needs_tbt (FU_DEVICE (ec_device))) {
|
||||
g_autoptr(FuDellDockTbt) tbt_device = fu_dell_dock_tbt_new (proxy);
|
||||
|
Loading…
Reference in New Issue
Block a user