On Wednesday, August 3, 2016 4:24:22 PM CEST Timur Tabi wrote: > Arnd Bergmann wrote: > > As I said, this is inherently driver specific. If setting the 64-bit > > mask fails, the driver itself needs to fall back to the 32-bit mask > > so it can allocate buffers from ZONE_DMA instead of ZONE_NORMAL. > > I just posted a v7 of my patch, but I forgot to fix the dma_set_mask > call. I'll post a v8 soon, but before I do, what do you think of this: > > /* The EMAC itself is capable of 64-bit DMA, so try that first. */ > ret = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64)); > if (ret) { > /* Some platforms may restrict the EMAC's address bus to less > * then the size of DDR. In this case, we need to try a > * smaller mask. We could try every possible smaller mask, > * but that's overkill. Instead, just fall to 32-bit, which > * should always work. > */ > ret = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32)); > if (ret) { > dev_err(&pdev->dev, "could not set DMA mask\n"); > return ret; > } > } This is basically ok, but then I think you should pass GFP_DMA or GFP_DMA32 to all allocations that the driver does after the 64-bit mask fails, otherwise you get a significant overhead in the bounce buffers. For data that comes from the network stack, we have no choice and always use bounce buffers for data that is beyond the mask. Arnd -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html