+ Amit

On Tue, Aug 05, 2025 at 10:22:10AM +0100, Andrew Goodbody wrote:
>On 05/08/2025 05:00, Peng Fan wrote:
>> On Thu, Jul 31, 2025 at 12:11:47PM +0100, Andrew Goodbody wrote:
>> > In owl_mmc_prepare_data there is a NULL check for the pointer data but
>> > it happens after data has already been dereferenced. Refactor the code
>> > so that the NULL check happens before any code dereferences data.
>> > 
>> > This issue was found by Smatch.
>> > 
>> > Signed-off-by: Andrew Goodbody <andrew.goodb...@linaro.org>
>> > ---
>> > drivers/mmc/owl_mmc.c | 18 +++++++++---------
>> > 1 file changed, 9 insertions(+), 9 deletions(-)
>> > 
>> > diff --git a/drivers/mmc/owl_mmc.c b/drivers/mmc/owl_mmc.c
>> > index bd4906f58e7..c18807b1f49 100644
>> > --- a/drivers/mmc/owl_mmc.c
>> > +++ b/drivers/mmc/owl_mmc.c
>> > @@ -135,19 +135,19 @@ static void owl_mmc_prepare_data(struct owl_mmc_priv 
>> > *priv,
>> > 
>> >    setbits_le32(priv->reg_base + OWL_REG_SD_EN, OWL_SD_EN_BSEL);
>> > 
>> > -  writel(data->blocks, priv->reg_base + OWL_REG_SD_BLK_NUM);
>> > -  writel(data->blocksize, priv->reg_base + OWL_REG_SD_BLK_SIZE);
>> > -  total = data->blocksize * data->blocks;
>> > -
>> > -  if (total < 512)
>> > -          writel(total, priv->reg_base + OWL_REG_SD_BUF_SIZE);
>> > -  else
>> > -          writel(512, priv->reg_base + OWL_REG_SD_BUF_SIZE);
>> > -
>> >    /* DMA STOP */
>> >    writel(0x0, SD_DMA_CHANNEL(priv->dma_channel, 0) + DMA_START);
>> > 
>> >    if (data) {
>> > +          writel(data->blocks, priv->reg_base + OWL_REG_SD_BLK_NUM);
>> > +          writel(data->blocksize, priv->reg_base + OWL_REG_SD_BLK_SIZE);
>> > +          total = data->blocksize * data->blocks;
>> > +
>> > +          if (total < 512)
>> > +                  writel(total, priv->reg_base + OWL_REG_SD_BUF_SIZE);
>> > +          else
>> > +                  writel(512, priv->reg_base + OWL_REG_SD_BUF_SIZE);
>> > +
>> 
>> This piece code is moved to after 'DMA STOP', so code logic is changed.
>> This may not be expected.
>
>Are you familiar with this hardware or is there anyone on the list who is
>that could comment on the preferred order of actions here?

Amit may help comment here.

>
>This was changed for two reasons. Firstly and of least importance, it makes
>the code tidier by needing just a single NULL check for 'data'. Secondly I
>wonder about the correctness of the original code. It seems a little strange
>to me to be writing to the device registers while the DMA is possibly active.
>This could potentially lead to undesired effects. I would expect that
>stopping the DMA before changing the registers would be a safer order to
>perform these actions. However I do admit that this is just speculation on my
>part and that this order could be fine or even necessary for some reason, but
>that would be.
>Also, of course, in the case that 'data' is NULL, the writes that were before
>the call to stop the DMA cannot be executed as they dereference 'data'.
>
>So yes this is a bit of a speculative change but I think it would be OK.
>But if you would rather I rework it to keep the ordering as before then I
>will do that. Please let me know.

I am fine with the changes, but need Amit who is the author of the driver
to give an Ack

Thanks,
Peng

>
>Andrew
>
>> Thanks,
>> Peng
>> 
>> >            if (data->flags == MMC_DATA_READ) {
>> >                    buf = (ulong) (data->dest);
>> >                    owl_dma_config(priv, (ulong) priv->reg_base +
>> > 
>> > ---
>> > base-commit: 79f3e77133bd7248e4579827effc13f97a32a8a8
>> > change-id: 20250731-owl_mmc-ef16e32b68fd
>> > 
>> > Best regards,
>> > -- 
>> > Andrew Goodbody <andrew.goodb...@linaro.org>
>> > 
>

Reply via email to