Re: [PATCH v4 4/9] bus: mhi: Centralize firmware image table selection at probe time
Manivannan Sadhasivam <[email protected]> Mon, 13 Apr 2026 16:56:53 +0530
| Newsgroups | dev.linux.lists.mhi,org.freedesktop.lists.dri-devel,org.kernel.vger.linux-arm-msm,org.kernel.vger.linux-doc,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <2sykuv6r643v3i6ymdoevzohoxdmgrrodvgpbaystskz7fwgun@fd3p7gcso252> |
On Thu, Mar 19, 2026 at 12:01:44PM +0530, Kishore Batta wrote: > The Sahara driver currently selects firmware image tables using > scattered, device specific conditionals in the probe path, making the > logic harder to follow and extend. > > Refactor firmware image table selection into a single, explicit probe-time > mechanism by introducing a variant table that captures device matching, > firmware image tables, firmware folder names, and streaming behavior in > one place. > > This centralizes device specific decisions, simplifies the probe logic, > and avoids ad-hoc conditionals while preserving the existing behavior for > all supported AIC devices. > > Signed-off-by: Kishore Batta <[email protected]> > --- > drivers/bus/mhi/sahara/sahara.c | 66 ++++++++++++++++++++++++++++++++++++----- > 1 file changed, 58 insertions(+), 8 deletions(-) > > diff --git a/drivers/bus/mhi/sahara/sahara.c b/drivers/bus/mhi/sahara/sahara.c > index e3499977e7c6b53bc624a8eb00d0636f2ea63307..8f1c0d72066c0cf80c09d78bfc51df2e482133b9 100644 > --- a/drivers/bus/mhi/sahara/sahara.c > +++ b/drivers/bus/mhi/sahara/sahara.c > @@ -180,6 +180,16 @@ struct sahara_context { > u32 read_data_length; > bool is_mem_dump_mode; > bool non_streaming; > + const char *fw_folder; > +}; > + > +struct sahara_variant { > + const char *match; > + bool match_is_chan; This name makes no sense. - Mani > + const char * const *image_table; > + size_t table_size; > + const char *fw_folder; > + bool non_streaming; > }; > > static const char * const aic100_image_table[] = { > @@ -224,11 +234,50 @@ static const char * const aic200_image_table[] = { > [78] = "qcom/aic200/pvs.bin", > }; > > +static const struct sahara_variant sahara_variants[] = { > + { > + .match = "AIC100", > + .match_is_chan = false, > + .image_table = aic100_image_table, > + .table_size = ARRAY_SIZE(aic100_image_table), > + .fw_folder = "aic100", > + .non_streaming = true, > + }, > + { > + .match = "AIC200", > + .match_is_chan = false, > + .image_table = aic200_image_table, > + .table_size = ARRAY_SIZE(aic200_image_table), > + .fw_folder = "aic200", > + .non_streaming = false, > + } > +}; > + > static bool is_streaming(struct sahara_context *context) > { > return !context->non_streaming; > } > > +static const struct sahara_variant *sahara_select_variant(struct mhi_device *mhi_dev, > + const struct mhi_device_id *id) > +{ > + int i; > + > + for (i = 0; i < ARRAY_SIZE(sahara_variants); i++) { > + const struct sahara_variant *v = &sahara_variants[i]; > + > + if (v->match_is_chan) { > + if (id && id->chan && !strcmp(id->chan, v->match)) > + return v; > + } else { > + if (mhi_dev->mhi_cntrl && mhi_dev->mhi_cntrl->name && > + !strcmp(mhi_dev->mhi_cntrl->name, v->match)) > + return v; > + } > + } > + return NULL; > +} > + > static int sahara_find_image(struct sahara_context *context, u32 image_id) > { > int ret; > @@ -797,6 +846,7 @@ static void sahara_read_data_processing(struct work_struct *work) > > static int sahara_mhi_probe(struct mhi_device *mhi_dev, const struct mhi_device_id *id) > { > + const struct sahara_variant *variant; > struct sahara_context *context; > int ret; > int i; > @@ -809,14 +859,14 @@ static int sahara_mhi_probe(struct mhi_device *mhi_dev, const struct mhi_device_ > if (!context->rx) > return -ENOMEM; > > - if (!strcmp(mhi_dev->mhi_cntrl->name, "AIC200")) { > - context->image_table = aic200_image_table; > - context->table_size = ARRAY_SIZE(aic200_image_table); > - } else { > - context->image_table = aic100_image_table; > - context->table_size = ARRAY_SIZE(aic100_image_table); > - context->non_streaming = true; > - } > + variant = sahara_select_variant(mhi_dev, id); > + if (!variant) > + return -ENODEV; > + > + context->image_table = variant->image_table; > + context->table_size = variant->table_size; > + context->non_streaming = variant->non_streaming; > + context->fw_folder = variant->fw_folder; > > /* > * There are two firmware implementations for READ_DATA handling. > > -- > 2.34.1 > -- மணிவண்ணன் சதாசிவம்