* ARM: v3.13-rc1: USB regression @ 2013-11-24 22:22 Aaro Koskinen 2013-11-24 22:43 ` Russell King - ARM Linux 0 siblings, 1 reply; 5+ messages in thread From: Aaro Koskinen @ 2013-11-24 22:22 UTC (permalink / raw) To: linux-arm-kernel Hi, With 3.13-rc1, the USB OHCI probe fails on Amstrad E3 (ARM/OMAP1) as follows: [ 33.814705] ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver [ 33.821482] ohci-omap: OHCI OMAP driver [ 33.925153] ohci ohci: OMAP OHCI [ 33.929087] ohci ohci: new USB bus registered, assigned bus number 1 [ 33.967324] ohci ohci: Coherent DMA mask 0xffffffff (pfn 0xe0000-0xe0000) covers a smaller range of system memory than the DMA zone pfn 0x0-0x100000 [ 33.982292] ohci ohci: can't setup: -12 [ 33.987898] ohci ohci: USB bus 1 deregistered [ 33.992984] ohci: probe of ohci failed with error -12 I bisected this to 4dcfa60071b3d23f0181f27d8519f12e37cefbb9 (ARM: DMA-API: better handing of DMA masks for coherent allocations). Reverting that commit makes the USB work again fine. A. ^ permalink raw reply [flat|nested] 5+ messages in thread
* ARM: v3.13-rc1: USB regression 2013-11-24 22:22 ARM: v3.13-rc1: USB regression Aaro Koskinen @ 2013-11-24 22:43 ` Russell King - ARM Linux 2013-11-25 16:33 ` Aaro Koskinen 0 siblings, 1 reply; 5+ messages in thread From: Russell King - ARM Linux @ 2013-11-24 22:43 UTC (permalink / raw) To: linux-arm-kernel On Mon, Nov 25, 2013 at 12:22:47AM +0200, Aaro Koskinen wrote: > Hi, > > With 3.13-rc1, the USB OHCI probe fails on Amstrad E3 (ARM/OMAP1) > as follows: > > [ 33.814705] ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver > [ 33.821482] ohci-omap: OHCI OMAP driver > [ 33.925153] ohci ohci: OMAP OHCI > [ 33.929087] ohci ohci: new USB bus registered, assigned bus number 1 > [ 33.967324] ohci ohci: Coherent DMA mask 0xffffffff (pfn 0xe0000-0xe0000) covers a smaller range of system memory than the DMA zone pfn 0x0-0x100000 > [ 33.982292] ohci ohci: can't setup: -12 > [ 33.987898] ohci ohci: USB bus 1 deregistered > [ 33.992984] ohci: probe of ohci failed with error -12 > > I bisected this to 4dcfa60071b3d23f0181f27d8519f12e37cefbb9 (ARM: DMA-API: > better handing of DMA masks for coherent allocations). Reverting that > commit makes the USB work again fine. This is because of this: #define __arch_dma_to_pfn(dev, addr) \ ({ dma_addr_t __dma = addr; \ if (is_lbus_device(dev)) \ __dma += PHYS_OFFSET - OMAP1510_LB_OFFSET; \ __phys_to_pfn(__dma); \ }) dma_addr_t is 32-bit. PHYS_OFFSET - OMAP1510_LB_OFFSET is 0xe0000000. Consider what the result of passing 0xffffffff as addr into this is. Better would be: #define __arch_dma_to_pfn(dev, addr) \ ({ unsigned long pfn = (addr) >> PAGE_SHIFT; \ if (is_lbus_device(dev)) \ pfn += PHYS_PFN_OFFSET - \ (OMAP1510_LB_OFFSET >> PAGE_SHIFT); \ pfn; \ }) Can you try that in arch/arm/mach-omap1/include/mach/memory.h please? ^ permalink raw reply [flat|nested] 5+ messages in thread
* ARM: v3.13-rc1: USB regression 2013-11-24 22:43 ` Russell King - ARM Linux @ 2013-11-25 16:33 ` Aaro Koskinen 2013-11-25 17:18 ` Russell King - ARM Linux 0 siblings, 1 reply; 5+ messages in thread From: Aaro Koskinen @ 2013-11-25 16:33 UTC (permalink / raw) To: linux-arm-kernel Hi, On Sun, Nov 24, 2013 at 10:43:59PM +0000, Russell King - ARM Linux wrote: > On Mon, Nov 25, 2013 at 12:22:47AM +0200, Aaro Koskinen wrote: > > [ 33.967324] ohci ohci: Coherent DMA mask 0xffffffff (pfn 0xe0000-0xe0000) covers a smaller range of system memory than the DMA zone pfn 0x0-0x100000 > > > > I bisected this to 4dcfa60071b3d23f0181f27d8519f12e37cefbb9 (ARM: DMA-API: > > better handing of DMA masks for coherent allocations). Reverting that > > commit makes the USB work again fine. [...] > Better would be: > > #define __arch_dma_to_pfn(dev, addr) \ > ({ unsigned long pfn = (addr) >> PAGE_SHIFT; \ > if (is_lbus_device(dev)) \ > pfn += PHYS_PFN_OFFSET - \ > (OMAP1510_LB_OFFSET >> PAGE_SHIFT); \ > pfn; \ > }) > > Can you try that in arch/arm/mach-omap1/include/mach/memory.h please? Still doesn't work: [ 33.878790] ohci ohci: Coherent DMA mask 0xffffffff (pfn 0xfffe0000-0xe0000) covers a smaller range of system memory than the DMA zone pfn 0x0-0x100000 [ 33.894019] ohci ohci: can't setup: -12 A. ^ permalink raw reply [flat|nested] 5+ messages in thread
* ARM: v3.13-rc1: USB regression 2013-11-25 16:33 ` Aaro Koskinen @ 2013-11-25 17:18 ` Russell King - ARM Linux 2013-11-25 21:12 ` Aaro Koskinen 0 siblings, 1 reply; 5+ messages in thread From: Russell King - ARM Linux @ 2013-11-25 17:18 UTC (permalink / raw) To: linux-arm-kernel On Mon, Nov 25, 2013 at 06:33:02PM +0200, Aaro Koskinen wrote: > Hi, > > On Sun, Nov 24, 2013 at 10:43:59PM +0000, Russell King - ARM Linux wrote: > > On Mon, Nov 25, 2013 at 12:22:47AM +0200, Aaro Koskinen wrote: > > > [ 33.967324] ohci ohci: Coherent DMA mask 0xffffffff (pfn 0xe0000-0xe0000) covers a smaller range of system memory than the DMA zone pfn 0x0-0x100000 > > > > > > I bisected this to 4dcfa60071b3d23f0181f27d8519f12e37cefbb9 (ARM: DMA-API: > > > better handing of DMA masks for coherent allocations). Reverting that > > > commit makes the USB work again fine. > > [...] > > > Better would be: > > > > #define __arch_dma_to_pfn(dev, addr) \ > > ({ unsigned long pfn = (addr) >> PAGE_SHIFT; \ > > if (is_lbus_device(dev)) \ > > pfn += PHYS_PFN_OFFSET - \ > > (OMAP1510_LB_OFFSET >> PAGE_SHIFT); \ > > pfn; \ > > }) > > > > Can you try that in arch/arm/mach-omap1/include/mach/memory.h please? > > Still doesn't work: > > [ 33.878790] ohci ohci: Coherent DMA mask 0xffffffff (pfn 0xfffe0000-0xe0000) covers a smaller range of system memory than the DMA zone pfn 0x0-0x100000 > [ 33.894019] ohci ohci: can't setup: -12 Well, that looks technically better, rather unfortunate that we end up going to negative PFNs though. Without that change, could you try this instead please: arch/arm/mm/dma-mapping.c | 9 +++++++-- 1 files changed, 7 insertions(+), 2 deletions(-) diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c index f0ea0134e5a3..a18cfc53f445 100644 --- a/arch/arm/mm/dma-mapping.c +++ b/arch/arm/mm/dma-mapping.c @@ -9,6 +9,7 @@ * * DMA uncached mapping support. */ +#include <linux/bootmem.h> #include <linux/module.h> #include <linux/mm.h> #include <linux/gfp.h> @@ -162,6 +163,8 @@ static u64 get_coherent_dma_mask(struct device *dev) u64 mask = (u64)DMA_BIT_MASK(32); if (dev) { + unsigned long max_dma_pfn; + mask = dev->coherent_dma_mask; /* @@ -173,6 +176,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 @@ -180,7 +185,7 @@ static u64 get_coherent_dma_mask(struct device *dev) */ if (sizeof(mask) != sizeof(dma_addr_t) && mask > (dma_addr_t)~0 && - dma_to_pfn(dev, ~0) > arm_dma_pfn_limit) { + 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"); @@ -192,7 +197,7 @@ static u64 get_coherent_dma_mask(struct device *dev) * fits within the allowable addresses which we can * allocate. */ - if (dma_to_pfn(dev, mask) < arm_dma_pfn_limit) { + 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, ^ permalink raw reply related [flat|nested] 5+ messages in thread
* ARM: v3.13-rc1: USB regression 2013-11-25 17:18 ` Russell King - ARM Linux @ 2013-11-25 21:12 ` Aaro Koskinen 0 siblings, 0 replies; 5+ messages in thread From: Aaro Koskinen @ 2013-11-25 21:12 UTC (permalink / raw) To: linux-arm-kernel Hi, On Mon, Nov 25, 2013 at 05:18:53PM +0000, Russell King - ARM Linux wrote: > On Mon, Nov 25, 2013 at 06:33:02PM +0200, Aaro Koskinen wrote: > > Hi, > > > > On Sun, Nov 24, 2013 at 10:43:59PM +0000, Russell King - ARM Linux wrote: > > > On Mon, Nov 25, 2013 at 12:22:47AM +0200, Aaro Koskinen wrote: > > > > [ 33.967324] ohci ohci: Coherent DMA mask 0xffffffff (pfn 0xe0000-0xe0000) covers a smaller range of system memory than the DMA zone pfn 0x0-0x100000 > > > > > > > > I bisected this to 4dcfa60071b3d23f0181f27d8519f12e37cefbb9 (ARM: DMA-API: > > > > better handing of DMA masks for coherent allocations). Reverting that > > > > commit makes the USB work again fine. > > > > [...] > > > > > Better would be: > > > > > > #define __arch_dma_to_pfn(dev, addr) \ > > > ({ unsigned long pfn = (addr) >> PAGE_SHIFT; \ > > > if (is_lbus_device(dev)) \ > > > pfn += PHYS_PFN_OFFSET - \ > > > (OMAP1510_LB_OFFSET >> PAGE_SHIFT); \ > > > pfn; \ > > > }) > > > > > > Can you try that in arch/arm/mach-omap1/include/mach/memory.h please? > > > > Still doesn't work: > > > > [ 33.878790] ohci ohci: Coherent DMA mask 0xffffffff (pfn 0xfffe0000-0xe0000) covers a smaller range of system memory than the DMA zone pfn 0x0-0x100000 > > [ 33.894019] ohci ohci: can't setup: -12 > > Well, that looks technically better, rather unfortunate that we end up > going to negative PFNs though. > > Without that change, could you try this instead please: This works, thanks. A. > arch/arm/mm/dma-mapping.c | 9 +++++++-- > 1 files changed, 7 insertions(+), 2 deletions(-) > > diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c > index f0ea0134e5a3..a18cfc53f445 100644 > --- a/arch/arm/mm/dma-mapping.c > +++ b/arch/arm/mm/dma-mapping.c > @@ -9,6 +9,7 @@ > * > * DMA uncached mapping support. > */ > +#include <linux/bootmem.h> > #include <linux/module.h> > #include <linux/mm.h> > #include <linux/gfp.h> > @@ -162,6 +163,8 @@ static u64 get_coherent_dma_mask(struct device *dev) > u64 mask = (u64)DMA_BIT_MASK(32); > > if (dev) { > + unsigned long max_dma_pfn; > + > mask = dev->coherent_dma_mask; > > /* > @@ -173,6 +176,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 > @@ -180,7 +185,7 @@ static u64 get_coherent_dma_mask(struct device *dev) > */ > if (sizeof(mask) != sizeof(dma_addr_t) && > mask > (dma_addr_t)~0 && > - dma_to_pfn(dev, ~0) > arm_dma_pfn_limit) { > + 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"); > @@ -192,7 +197,7 @@ static u64 get_coherent_dma_mask(struct device *dev) > * fits within the allowable addresses which we can > * allocate. > */ > - if (dma_to_pfn(dev, mask) < arm_dma_pfn_limit) { > + 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, > ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2013-11-25 21:12 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2013-11-24 22:22 ARM: v3.13-rc1: USB regression Aaro Koskinen 2013-11-24 22:43 ` Russell King - ARM Linux 2013-11-25 16:33 ` Aaro Koskinen 2013-11-25 17:18 ` Russell King - ARM Linux 2013-11-25 21:12 ` Aaro Koskinen
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).