Plugin: Intel GSC — Graphics System Controller
Introduction
This plugin is used to update the Intel graphics system controller via the Intel Management Engine.
Firmware Format
FWCODE
- This is a superset of FuIfwiFptFirmware
- The INFOpartition is aFuStructIgscFwuImageMetadataV1, which gives theidandversion, and theFuStructIgscFwuFwImageDatais also part of that. This then gives thearb_svn.
- The IMGIpartition is aFuStructIgscFwuGwsImageInfo, which gives ushw_sku
<firmware gtype="FuIgscCodeFirmware">
  <id>BMG_</id>
  <version>0021.1111</version>
  <hw_sku>0x2</hw_sku>
  <arb_svn>0x2</arb_svn>
  <firmware>
    <id>INFO</id>
  </firmware>
  <firmware>
    <id>IMGI</id>
  </firmware>
  <firmware>
    <id>FWIM</id>
  </firmware>
</firmware>
FWDATA
- This is a superset of FuIfwiFptFirmware
- The INFOpartition is aFuIfwiCpdFirmwareis aFuStructIgscFwdataVersion. This providesoem_version,major_versionanddata_arb_svn.
- The SDTA(also called a “GDTA”) data partition is aFuIfwiCpdFirmware
<firmware gtype="FuIgscAuxFirmware">
  <oem_version>0x39</oem_version>
  <major_version>0xcb</major_version>
  <data_arb_svn>0x1</data_arb_svn>
  <device_infos>
    <match>
      <vendor_id>0x8086</vendor_id>
      <device_id>0xe20b</device_id>
      <subsys_vendor_id>0x8086</subsys_vendor_id>
      <subsys_device_id>0x1100</subsys_device_id>
    </match>
  </device_infos>
  <firmware>
    <id>INFO</id>
  </firmware>
  <firmware>
    <id>CKSM</id>
  </firmware>
  <firmware>
    <id>GDTA</id>
  </firmware>
</firmware>
- The SDTAis parsed as:
<firmware gtype="FuIfwiCpdFirmware">
  <header_version>0x2</header_version>
  <entry_version>0x1</entry_version>
  <firmware>
    <id>GDTA.man</id>
    <version_raw>0xcb</version_raw>
    <firmware>
      <idx>0x23</idx>
    </firmware>
    <firmware>
      <idx>0x16</idx>
    </firmware>
    <firmware>
      <idx>0x1d</idx>
    </firmware>
    <firmware>
      <idx>0x25</idx>
    </firmware>
  </firmware>
  <firmware>
    <id>GDTA</id>
  </firmware>
  <firmware>
    <id>GDTA.met</id>
  </firmware>
</firmware>
- The GDTA.manpartition of the CPD contains the manifest extensions.
OPROMCODE
- This must be only the first oprom image in the payload.
- The oprom expansion header is formatted as a FuIfwiCpdFirmwareimage
- The OROM.mansection has two unknown (and unparsed) extension types
<firmware gtype="FuIgscOpromFirmware">
  <idx>0xf1</idx>
  <size>0x800</size>
  <firmware gtype="FuIfwiCpdFirmware">
    <id>cpd</id>
    <idx>0x4d4f524f</idx>
    <header_version>0x2</header_version>
    <entry_version>0x1</entry_version>
    <firmware>
      <id>OROM.man</id>
      <version_raw>0x4200017</version_raw>
      <firmware>
        <idx>0x23</idx>
      </firmware>
      <firmware>
        <idx>0x16</idx>
      </firmware>
    </firmware>
    <firmware>
      <id>CODE</id>
    </firmware>
    <firmware>
      <id>CODE.met</id>
    </firmware>
  </firmware>
</firmware>
OPROMDATA
- This must be only the first oprom image in the payload.
<firmware gtype="FuIgscOpromFirmware">
  <idx>0xf0</idx>
  <size>0x800</size>
  <device_infos>
    <match>
      <vendor_id>0x8086</vendor_id>
      <device_id>0xe20b</device_id>
      <subsys_vendor_id>0x8086</subsys_vendor_id>
      <subsys_device_id>0x1100</subsys_device_id>
    </match>
  </device_infos>
  <firmware gtype="FuIfwiCpdFirmware">
    <id>cpd</id>
    <idx>0x4d4f524f</idx>
    <header_version>0x2</header_version>
    <entry_version>0x1</entry_version>
    <firmware>
      <id>OROM.man</id>
      <version_raw>0x4200017</version_raw>
      <firmware>
        <idx>0x23</idx>
      </firmware>
      <firmware>
        <idx>0x16</idx>
      </firmware>
      <firmware>
        <idx>0x25</idx>
      </firmware>
    </firmware>
    <firmware>
      <id>VBT</id>
      <idx>0x1</idx>
    </firmware>
    <firmware>
      <id>VBT.met</id>
      <idx>0x2</idx>
    </firmware>
  </firmware>
</firmware>
This plugin supports the following protocol ID, used by all devices and sub-devices:
- com.intel.gsc
GUID Generation
These devices use the standard PCI DeviceInstanceId values, e.g.
- PCI\VEN_8086&DEV_E20B
They also define custom per-part PCI IDs such as:
- PCI\VEN_8086&DEV_E20B&PART_FWCODE
- PCI\VEN_8086&DEV_E20B&PART_FWDATA
- PCI\VEN_8086&DEV_E20B&PART_OPROMCODE
- PCI\VEN_8086&DEV_E20B&PART_OPROMDATA
When the device needs recovery, the instance IDs will instead be:
- PCI\VEN_8086&DEV_E20B&PART_FWCODE_RECOVERY
- PCI\VEN_8086&DEV_E20B&PART_FWDATA_RECOVERY
- PCI\VEN_8086&DEV_E20B&PART_OPROMCODE_RECOVERY
- PCI\VEN_8086&DEV_E20B&PART_OPROMDATA_RECOVERY
Quirk Use
This plugin uses the following plugin-specific quirks:
Flags=has-aux
Has an AUX child device.
Flags=has-oprom
Has an option ROM child device.
Vendor ID Security
The vendor ID is set from the PCI vendor, in this instance set to MEI:0x8086
External Interface Access
This plugin requires read/write access to /dev/mei*.
Version Considerations
This plugin has been available since fwupd version 1.8.7.
Owners
Anyone can submit a pull request to modify this plugin, but the following people should be consulted before making major or functional changes:
- Frank Scarbrough: Fscarbr