questions about drivers/dma/amba-pl08x.c

Kassey Lee kassey1216 at gmail.com
Tue Apr 10 06:42:49 EDT 2012


hi, Linus, Walleij:
        thanks for your answer! is this you meaning?

Subject: [PATCH] dmaengine/amba-pl08x: check slave_channels to avoid kernel
 panic

slave_channels is platform dependent, it should
be initialized by board.c, and here we need to check it
to avoid a NULL panic.

Signed-off-by: Kassey,Lee <kassey1216 at gmail.com>
---
 drivers/dma/amba-pl08x.c |    7 +++++++
 1 files changed, 7 insertions(+), 0 deletions(-)

diff --git a/drivers/dma/amba-pl08x.c b/drivers/dma/amba-pl08x.c
index c301a8e..b558ea6 100644
--- a/drivers/dma/amba-pl08x.c
+++ b/drivers/dma/amba-pl08x.c
@@ -1687,6 +1687,13 @@ static int
pl08x_dma_init_virtual_channels(struct pl08x_driver_data *pl08x,
                chan->state = PL08X_CHAN_IDLE;

                if (slave) {
+                       if (!pl08x->pd->slave_channels) {
+                               dev_err(&pl08x->adev->dev,
+                                       "%s slave_channels is
+                                                not initialized\n", __func__);
+                               kfree(chan);
+                               return -EFAULT;
+                       }
                        chan->cd = &pl08x->pd->slave_channels[i];
                        pl08x_dma_slave_init(chan);
                } else {
--
1.7.5.4

2012/4/10 Linus Walleij <linus.walleij at linaro.org>:
> On Tue, Apr 10, 2012 at 9:30 AM, Kassey Lee <kassey1216 at gmail.com> wrote:
>
>>             1) how to add the devices resource for this driver ? i
>> did not find any info in the kernel but this driver.
>
> There are pending patches fore RealView for this driver.
> http://marc.info/?l=linux-arm-kernel&m=128568461506103&w=2
>
> (Yes I know I should finish this patch set...)
>
> Hm, Viresh have you posted your platform code for PL080 on
> SPEAr?
>
>>             2) in the below function, if the slave is set true,
>> kernel will panic, because slave_channels is NULL, and nobody
>> initialize this member, should this member be initialized by vendor ?
>>
>>
>> static int pl08x_dma_init_virtual_channels(struct pl08x_driver_data *pl08x,
>>                struct dma_device *dmadev, unsigned int channels, bool slave)
>> {
>>        struct pl08x_dma_chan *chan;
>>        int i;
>>
>>        INIT_LIST_HEAD(&dmadev->channels);
>>
>>        /*
>>         * Register as many many memcpy as we have physical channels,
>>         * we won't always be able to use all but the code will have
>>         * to cope with that situation.
>>         */
>>        for (i = 0; i < channels; i++) {
>>                chan = kzalloc(sizeof(*chan), GFP_KERNEL);
>>                if (!chan) {
>>                        dev_err(&pl08x->adev->dev,
>>                                "%s no memory for channel\n", __func__);
>>                        return -ENOMEM;
>>                }
>>
>>                chan->host = pl08x;
>>                chan->state = PL08X_CHAN_IDLE;
>>
>>                if (slave) {
>>                        chan->cd = &pl08x->pd->slave_channels[i];
>>                        pl08x_dma_slave_init(chan);
>>                } else {
>>
>
> Sorry, I'm not following, so slave is true and there is still no slave
> channels defined? It looks like your platform data is wrong.
>
> But better error checking is always needed so if you want to,
> please send a patch to improve it...
>
> Yours,
> Linus Walleij



-- 
Best regards
Kassey



More information about the linux-arm-kernel mailing list