Re: [PATCH 2/9] arm/tegra: use APB DMA for accessing APB devices

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, Jan 4, 2012 at 2:08 PM, Stephen Warren <swarren@xxxxxxxxxx> wrote:
> Olof Johansson wrote at Thursday, December 22, 2011 5:18 PM:
>> Tegra2 hangs if APB registers are accessed from the cpu during an
>> apb dma operation. The workaround is to use apb dma to read/write the
>> registers instead.
> ...
>> diff --git a/arch/arm/mach-tegra/apbio.c b/arch/arm/mach-tegra/apbio.c
> ...
>> +bool tegra_apb_init(void)
>> +{
> ...
>> +out:
>> +     mutex_unlock(&tegra_apb_dma_lock);
>> +     return true;
>> +
>> +out_fail:
>> +     mutex_unlock(&tegra_apb_dma_lock);
>> +     return true;
>
> Presumably that should be "return false".

Yes, my bad. There's an accidental chunk in a later patch that swaps
it back to false that got squashed with the wrong patch.

>
>> +u32 tegra_apb_readl(unsigned long offset)
>> +{
>> +     struct tegra_dma_req req;
>> +     int ret;
>> +
>> +     if (!tegra_apb_dma && !tegra_apb_init())
>> +             return readl(IO_TO_VIRT(offset));
>> +
>> +     mutex_lock(&tegra_apb_dma_lock);
>> +     req.complete = apb_dma_complete;
>> +     req.to_memory = 1;
>> +     req.dest_addr = tegra_apb_bb_phys;
>> +     req.dest_bus_width = 32;
>> +     req.dest_wrap = 1;
>> +     req.source_addr = offset;
>> +     req.source_bus_width = 32;
>> +     req.source_wrap = 4;
>> +     req.req_sel = 0;
>
> Should that be TEGRA_DMA_REQ_SEL_CNTR instead of 0? Although I'm not
> sure what "CNTR" means, and the documentation doesn't seem to say.

Sure, will update.

>> +     req.size = 4;
>> +
>> +     INIT_COMPLETION(tegra_apb_wait);
>> +
>> +     tegra_dma_enqueue_req(tegra_apb_dma, &req);
>> +
>> +     ret = wait_for_completion_timeout(&tegra_apb_wait,
>> +             msecs_to_jiffies(50));
>> +
>> +     if (WARN(ret == 0, "apb read dma timed out"))
>> +             *(u32 *)tegra_apb_bb = 0;
>
> On failure, you should probably call tegra_dma_dequeue_req() to cancel
> the DMA request, otherwise (a) it'll wake up and trash some future
> transfer, or (b) it'll be in the queue forever, and prevent any future
> DMA requests from being programmed into HW.
>
> Those two comments repeated from tegra_apb_writel().

Good point, will update.


-Olof
--
To unsubscribe from this list: send the line "unsubscribe linux-tegra" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [ARM Kernel]     [Linux ARM]     [Linux ARM MSM]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux