dell-dock: Add initial support for USB4 module

This commit is contained in:
Crag Wang 2021-03-09 00:02:21 -06:00 committed by Mario Limonciello
parent d46bdb3788
commit 9264dc1bca
5 changed files with 82 additions and 19 deletions

View File

@ -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
---------------

View File

@ -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

View File

@ -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;

View File

@ -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);

View File

@ -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);