Re: [PATCH v2 15/17] crypto: qce: Defer probing if BAM dma is not yet initialized
From: Bhupesh Sharma
Date: Tue May 18 2021 - 10:45:17 EST
HI Thara,
On Mon, 10 May 2021 at 18:52, Thara Gopinath <thara.gopinath@xxxxxxxxxx> wrote:
>
>
>
> On 5/5/21 5:37 PM, Bhupesh Sharma wrote:
> > Since the Qualcomm qce crypto driver needs the BAM dma driver to be
> > setup first (to allow crypto operations), it makes sense to defer
> > the qce crypto driver probing in case the BAM dma driver is not yet
> > probed.
> >
> > This fixes the qce probe failure issues when both qce and BMA dma
> > are compiled as static part of the kernel.
> >
> > Cc: Thara Gopinath <thara.gopinath@xxxxxxxxxx>
> > Cc: Bjorn Andersson <bjorn.andersson@xxxxxxxxxx>
> > Cc: Rob Herring <robh+dt@xxxxxxxxxx>
> > Cc: Andy Gross <agross@xxxxxxxxxx>
> > Cc: Herbert Xu <herbert@xxxxxxxxxxxxxxxxxxx>
> > Cc: David S. Miller <davem@xxxxxxxxxxxxx>
> > Cc: Stephen Boyd <sboyd@xxxxxxxxxx>
> > Cc: Michael Turquette <mturquette@xxxxxxxxxxxx>
> > Cc: Vinod Koul <vkoul@xxxxxxxxxx>
> > Cc: dmaengine@xxxxxxxxxxxxxxx
> > Cc: linux-clk@xxxxxxxxxxxxxxx
> > Cc: linux-crypto@xxxxxxxxxxxxxxx
> > Cc: devicetree@xxxxxxxxxxxxxxx
> > Cc: linux-kernel@xxxxxxxxxxxxxxx
> > Cc: bhupesh.linux@xxxxxxxxx
> > Signed-off-by: Bhupesh Sharma <bhupesh.sharma@xxxxxxxxxx>
> > ---
> > drivers/crypto/qce/core.c | 4 ++++
> > drivers/dma/qcom/bam_dma.c | 7 +++++++
> > 2 files changed, 11 insertions(+)
> >
> > diff --git a/drivers/crypto/qce/core.c b/drivers/crypto/qce/core.c
> > index 9a7d7ef94687..3e742e9911fa 100644
> > --- a/drivers/crypto/qce/core.c
> > +++ b/drivers/crypto/qce/core.c
> > @@ -15,6 +15,7 @@
> > #include <linux/types.h>
> > #include <crypto/algapi.h>
> > #include <crypto/internal/hash.h>
> > +#include <soc/qcom/bam_dma.h>
> >
> > #include "core.h"
> > #include "cipher.h"
> > @@ -201,6 +202,9 @@ static int qce_crypto_probe(struct platform_device *pdev)
> > of_match_device(qce_crypto_of_match, &pdev->dev);
> > int ret;
> >
> > + /* qce driver requires BAM dma driver to be setup first */
> > + if (!bam_is_probed())
> > + return -EPROBE_DEFER;
>
> Hi Bhupesh,
>
> You don't need this here. qce_dma_request returns -EPROBE_DEFER if the
> dma controller is not probed yet.
Thanks for the review.
Yes, we can just use qce_dma_request() return value to return from the
qce probe() function early, in case the bam dma channels are not
available yet.
I have made the changes in v3 and will post it for review shortly.
Regards,
Bhupesh
> >
> > qce = devm_kzalloc(dev, sizeof(*qce), GFP_KERNEL);
> > if (!qce)
> > diff --git a/drivers/dma/qcom/bam_dma.c b/drivers/dma/qcom/bam_dma.c
> > index 2bc3b7c7ee5a..c854fcc82dbf 100644
> > --- a/drivers/dma/qcom/bam_dma.c
> > +++ b/drivers/dma/qcom/bam_dma.c
> > @@ -935,6 +935,12 @@ static void bam_channel_init(struct bam_device *bdev, struct bam_chan *bchan,
> > INIT_LIST_HEAD(&bchan->desc_list);
> > }
> >
> > +bool bam_is_probed(void)
> > +{
> > + return bam_probed;
> > +}
> > +EXPORT_SYMBOL_GPL(bam_is_probed);
> > +
> > static const struct of_device_id bam_of_match[] = {
> > { .compatible = "qcom,bam-v1.3.0", .data = &bam_v1_3_reg_info },
> > { .compatible = "qcom,bam-v1.4.0", .data = &bam_v1_4_reg_info },
> > @@ -1084,6 +1090,7 @@ static int bam_dma_probe(struct platform_device *pdev)
> > if (ret)
> > goto err_unregister_dma;
> >
> > + bam_probed = true;
> > if (!bdev->bamclk) {
> > pm_runtime_disable(&pdev->dev);
> > return 0;
> >
>