Enable update of a selected component.

Reviewed-by: Marcin Szycik <marcin.szy...@linux.intel.com>
Reviewed-by: Przemek Kitszel <przemyslaw.kits...@intel.com>
Signed-off-by: Konrad Knitter <konrad.knit...@intel.com>
---
 include/linux/pldmfw.h | 8 ++++++++
 lib/pldmfw/pldmfw.c    | 8 ++++++++
 2 files changed, 16 insertions(+)

diff --git a/include/linux/pldmfw.h b/include/linux/pldmfw.h
index 0fc831338226..f5047983004f 100644
--- a/include/linux/pldmfw.h
+++ b/include/linux/pldmfw.h
@@ -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);
diff --git a/lib/pldmfw/pldmfw.c b/lib/pldmfw/pldmfw.c
index 6e1581b9a616..6264e2013f25 100644
--- a/lib/pldmfw/pldmfw.c
+++ b/lib/pldmfw/pldmfw.c
@@ -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));
-- 
2.38.1

Reply via email to