[alsa-devel] [PATCH] ASoC: omap-pcm: Lower the dma coherent mask to 32bits
Peter Ujfalusi
peter.ujfalusi at ti.com
Fri Dec 13 12:46:46 CET 2013
On 12/10/2013 11:37 AM, Peter Ujfalusi wrote:
> Hi Russell,
>
> On 12/09/2013 07:03 PM, Russell King - ARM Linux wrote:
>> Yes, that's a good idea. Revised version of the patch. Peter, can you
>> retest please, thanks.
>
> With this patch PandaES and BeagleXM works fine on top of today's mainline.
>
> Thank you Russell and Takashi!
>
> Tested-by: Peter Ujfalusi <peter.ujfalusi at ti.com>
Russell,
are you planning to send this for 3.13? Without the patch all OMAP audio fails
to probe in 3.13 kernel.
--
Péter
>
>> diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c
>> index f6b6bfa88ecf..86c564e52ea7 100644
>> --- a/arch/arm/mm/dma-mapping.c
>> +++ b/arch/arm/mm/dma-mapping.c
>> @@ -158,6 +158,44 @@ struct dma_map_ops arm_coherent_dma_ops = {
>> };
>> EXPORT_SYMBOL(arm_coherent_dma_ops);
>>
>> +static int __dma_supported(struct device *dev, u64 mask, bool warn)
>> +{
>> + unsigned long max_dma_pfn;
>> +
>> + /*
>> + * If the mask allows for more memory than we can address,
>> + * and we actually have that much memory, then we must
>> + * indicate that DMA to this device is not supported.
>> + */
>> + if (sizeof(mask) != sizeof(dma_addr_t) &&
>> + mask > (dma_addr_t)~0 &&
>> + dma_to_pfn(dev, ~0) < max_pfn) {
>> + if (warn) {
>> + dev_warn(dev, "Coherent DMA mask %#llx is larger than dma_addr_t allows\n",
>> + mask);
>> + dev_warn(dev, "Driver did not use or check the return value from dma_set_coherent_mask()?\n");
>> + }
>> + return 0;
>> + }
>> +
>> + max_dma_pfn = min(max_pfn, arm_dma_pfn_limit);
>> +
>> + /*
>> + * Translate the device's DMA mask to a PFN limit. This
>> + * PFN number includes the page which we can DMA to.
>> + */
>> + if (dma_to_pfn(dev, mask) < max_dma_pfn) {
>> + if (warn)
>> + dev_warn(dev, "Coherent DMA mask %#llx (pfn %#lx-%#lx) covers a smaller range of system memory than the DMA zone pfn 0x0-%#lx\n",
>> + mask,
>> + dma_to_pfn(dev, 0), dma_to_pfn(dev, mask) + 1,
>> + max_dma_pfn + 1);
>> + return 0;
>> + }
>> +
>> + return 1;
>> +}
>> +
>> static u64 get_coherent_dma_mask(struct device *dev)
>> {
>> u64 mask = (u64)DMA_BIT_MASK(32);
>> @@ -176,34 +214,8 @@ static u64 get_coherent_dma_mask(struct device *dev)
>> return 0;
>> }
>>
>> - max_dma_pfn = min(max_pfn, arm_dma_pfn_limit);
>> -
>> - /*
>> - * If the mask allows for more memory than we can address,
>> - * and we actually have that much memory, then fail the
>> - * allocation.
>> - */
>> - if (sizeof(mask) != sizeof(dma_addr_t) &&
>> - mask > (dma_addr_t)~0 &&
>> - dma_to_pfn(dev, ~0) > max_dma_pfn) {
>> - dev_warn(dev, "Coherent DMA mask %#llx is larger than dma_addr_t allows\n",
>> - mask);
>> - dev_warn(dev, "Driver did not use or check the return value from dma_set_coherent_mask()?\n");
>> - return 0;
>> - }
>> -
>> - /*
>> - * Now check that the mask, when translated to a PFN,
>> - * fits within the allowable addresses which we can
>> - * allocate.
>> - */
>> - if (dma_to_pfn(dev, mask) < max_dma_pfn) {
>> - dev_warn(dev, "Coherent DMA mask %#llx (pfn %#lx-%#lx) covers a smaller range of system memory than the DMA zone pfn 0x0-%#lx\n",
>> - mask,
>> - dma_to_pfn(dev, 0), dma_to_pfn(dev, mask) + 1,
>> - arm_dma_pfn_limit + 1);
>> + if (!__dma_supported(dev, mask, true))
>> return 0;
>> - }
>> }
>>
>> return mask;
>> @@ -1032,28 +1044,7 @@ void arm_dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg,
>> */
>> int dma_supported(struct device *dev, u64 mask)
>> {
>> - unsigned long limit;
>> -
>> - /*
>> - * If the mask allows for more memory than we can address,
>> - * and we actually have that much memory, then we must
>> - * indicate that DMA to this device is not supported.
>> - */
>> - if (sizeof(mask) != sizeof(dma_addr_t) &&
>> - mask > (dma_addr_t)~0 &&
>> - dma_to_pfn(dev, ~0) > arm_dma_pfn_limit)
>> - return 0;
>> -
>> - /*
>> - * Translate the device's DMA mask to a PFN limit. This
>> - * PFN number includes the page which we can DMA to.
>> - */
>> - limit = dma_to_pfn(dev, mask);
>> -
>> - if (limit < arm_dma_pfn_limit)
>> - return 0;
>> -
>> - return 1;
>> + return __dma_supported(dev, mask, false);
>> }
>> EXPORT_SYMBOL(dma_supported);
>>
>>
>
>
More information about the Alsa-devel
mailing list