diff mbox series

[iwl-next,v1,1/3] pldmfw: selected component update

Message ID 20241023100702.12606-2-konrad.knitter@intel.com (mailing list archive)
State New
Headers show
Series support FW Recovery Mode | expand

Checks

Context Check Description
netdev/tree_selection success Guessing tree name failed - patch did not apply

Commit Message

Knitter, Konrad Oct. 23, 2024, 10:07 a.m. UTC
Enable update of a selected component.

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>
---
 include/linux/pldmfw.h | 8 ++++++++
 lib/pldmfw/pldmfw.c    | 8 ++++++++
 2 files changed, 16 insertions(+)

Comments

Paul Menzel Oct. 23, 2024, 10:07 a.m. UTC | #1
Dear Konrad,


Thank you for your patch.

Am 23.10.24 um 12:07 schrieb Konrad Knitter:
> Enable update of a selected component.

It’d be great if you used that for the summary/title to make it a 
statement (by adding a verb in imperative mood).

It’d be great, if you elaborated, what that feature is, and included the 
documentation used for the implementation. Also, how can it be tested?

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


Kind regards,

Paul
Knitter, Konrad Oct. 23, 2024, 10:46 a.m. UTC | #2
> -----Original Message-----
> From: Paul Menzel <pmenzel@molgen.mpg.de>
> Sent: Wednesday, October 23, 2024 12:07 PM
> To: Knitter, Konrad <konrad.knitter@intel.com>
> Cc: intel-wired-lan@lists.osuosl.org; Keller, Jacob E
> <jacob.e.keller@intel.com>; netdev@vger.kernel.org; jiri@resnulli.us;
> davem@davemloft.net; edumazet@google.com; kuba@kernel.org;
> pabeni@redhat.com; linux-kernel@vger.kernel.org; Nguyen, Anthony L
> <anthony.l.nguyen@intel.com>; Kitszel, Przemyslaw
> <przemyslaw.kitszel@intel.com>; Marcin Szycik
> <marcin.szycik@linux.intel.com>
> Subject: Re: [Intel-wired-lan] [PATCH iwl-next v1 1/3] pldmfw: selected
> component update
> 
> Dear Konrad,
> 
> 
> Thank you for your patch.
> 
> Am 23.10.24 um 12:07 schrieb Konrad Knitter:
> > Enable update of a selected component.
> 
> It’d be great if you used that for the summary/title to make it a
> statement (by adding a verb in imperative mood).
> 
> It’d be great, if you elaborated, what that feature is, and included the
> documentation used for the implementation. 
> 

Please comment if this would be enough:

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;

>> Also, how can it be tested?

This is enabler for ice patch, where on legacy FW versions where only "fw.mgmt" component can is 
allowed to be flashed in recovery mode.

There are no dedicated images for recovery.
Usual image contains multiple components.

This patch can be then tested together with other patches in series on Intel E810 NIC - where you can 
now execute update full card or just "fw.mgmt" component.

> > 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>
> > ---
> >   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));
> 
> 
> Kind regards,
> 
> Paul
Keller, Jacob E Oct. 23, 2024, 9:26 p.m. UTC | #3
> -----Original Message-----
> From: Knitter, Konrad <konrad.knitter@intel.com>
> Sent: Wednesday, October 23, 2024 3:07 AM
> To: intel-wired-lan@lists.osuosl.org
> Cc: Keller, Jacob E <jacob.e.keller@intel.com>; netdev@vger.kernel.org;
> jiri@resnulli.us; davem@davemloft.net; edumazet@google.com;
> kuba@kernel.org; pabeni@redhat.com; linux-kernel@vger.kernel.org; Nguyen,
> Anthony L <anthony.l.nguyen@intel.com>; Kitszel, Przemyslaw
> <przemyslaw.kitszel@intel.com>; Knitter, Konrad <konrad.knitter@intel.com>;
> Marcin Szycik <marcin.szycik@linux.intel.com>
> Subject: [PATCH iwl-next v1 1/3] pldmfw: selected component update
> 
> Enable update of a selected component.
> 
> 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>

Reviewed-by: Jacob Keller <jacob.e.keller@intel.com>

Thanks for the PLDM improvement!
diff mbox series

Patch

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