diff --git a/plugins/dell-dock/README.md b/plugins/dell-dock/README.md index f5ada036c..456ba9f11 100644 --- a/plugins/dell-dock/README.md +++ b/plugins/dell-dock/README.md @@ -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 --------------- diff --git a/plugins/dell-dock/dell-dock.quirk b/plugins/dell-dock/dell-dock.quirk index 5ecc3bfa7..37710f381 100644 --- a/plugins/dell-dock/dell-dock.quirk +++ b/plugins/dell-dock/dell-dock.quirk @@ -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 diff --git a/plugins/dell-dock/fu-dell-dock-i2c-ec.c b/plugins/dell-dock/fu-dell-dock-i2c-ec.c index 793dcb391..9903bddab 100644 --- a/plugins/dell-dock/fu-dell-dock-i2c-ec.c +++ b/plugins/dell-dock/fu-dell-dock-i2c-ec.c @@ -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; diff --git a/plugins/dell-dock/fu-dell-dock-i2c-ec.h b/plugins/dell-dock/fu-dell-dock-i2c-ec.h index 161e74425..3454cfead 100644 --- a/plugins/dell-dock/fu-dell-dock-i2c-ec.h +++ b/plugins/dell-dock/fu-dell-dock-i2c-ec.h @@ -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); diff --git a/plugins/dell-dock/fu-plugin-dell-dock.c b/plugins/dell-dock/fu-plugin-dell-dock.c index bd590346b..19feb9547 100644 --- a/plugins/dell-dock/fu-plugin-dell-dock.c +++ b/plugins/dell-dock/fu-plugin-dell-dock.c @@ -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);