]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
pldmfw: enable selected component update
authorKonrad Knitter <konrad.knitter@intel.com>
Wed, 6 Nov 2024 09:36:41 +0000 (10:36 +0100)
committerTony Nguyen <anthony.l.nguyen@intel.com>
Thu, 16 Jan 2025 21:04:41 +0000 (13:04 -0800)
This patch enables to update a selected component from PLDM image
containing multiple components.

Example usage:

struct pldmfw;
data.mode = PLDMFW_UPDATE_MODE_SINGLE_COMPONENT;
data.compontent_identifier = DRIVER_FW_MGMT_COMPONENT_ID;

Reviewed-by: Jacob Keller <jacob.e.keller@intel.com>
Reviewed-by: Marcin Szycik <marcin.szycik@linux.intel.com>
Reviewed-by: Przemek Kitszel <przemyslaw.kitszel@intel.com>
Signed-off-by: Konrad Knitter <konrad.knitter@intel.com>
Tested-by: Pucha Himasekhar Reddy <himasekharx.reddy.pucha@intel.com> (A Contingent worker at Intel)
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
include/linux/pldmfw.h
lib/pldmfw/pldmfw.c

index 0fc8313382262fd4d69ebf0e8baf6a7eb1587a33..f5047983004f0db64f0892d0dcfa04f539954c0e 100644 (file)
@@ -125,9 +125,17 @@ struct pldmfw_ops;
  * a pointer to their own data, used to implement the device specific
  * operations.
  */
+
+enum pldmfw_update_mode {
+       PLDMFW_UPDATE_MODE_FULL,
+       PLDMFW_UPDATE_MODE_SINGLE_COMPONENT,
+};
+
 struct pldmfw {
        const struct pldmfw_ops *ops;
        struct device *dev;
+       u16 component_identifier;
+       enum pldmfw_update_mode mode;
 };
 
 bool pldmfw_op_pci_match_record(struct pldmfw *context, struct pldmfw_record *record);
index 6e1581b9a616126e13458370e14aaa3ac4917ac7..6264e2013f25ee1f9f729b5689c5542e8e4c2b78 100644 (file)
@@ -481,9 +481,17 @@ static int pldm_parse_components(struct pldmfw_priv *data)
                component->component_data = data->fw->data + offset;
                component->component_size = size;
 
+               if (data->context->mode == PLDMFW_UPDATE_MODE_SINGLE_COMPONENT &&
+                   data->context->component_identifier != component->identifier)
+                       continue;
+
                list_add_tail(&component->entry, &data->components);
        }
 
+       if (data->context->mode == PLDMFW_UPDATE_MODE_SINGLE_COMPONENT &&
+           list_empty(&data->components))
+               return -ENOENT;
+
        header_crc_ptr = data->fw->data + data->offset;
 
        err = pldm_move_fw_offset(data, sizeof(data->header_crc));