Hi Lokesh, > dma_addr_t holds any valid DMA address. If the DMA API only uses > 32-bit addresses, dma_addr_t need only be 32 bits wide. Bus > addresses, e.g., PCI BARs, may be wider than 32 bits, but drivers do > memory-mapped I/O to ioremapped kernel virtual addresses, so they > don't care about the size of the actual bus addresses. > Also 32 bit ARM systems with LPAE enabled can use 64bit address > space, but DMA still use 32bit address like in case of DRA7 and > Keystone platforms.
I've already stumbled upon this issue... > > This is inspired from the Linux kernel types implementation[1] > > [1] > https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/include/linux/types.h#n142 > > Signed-off-by: Lokesh Vutla <lokeshvu...@ti.com> > --- > arch/arm/include/asm/types.h | 17 +++++++++++++++-- > 1 file changed, 15 insertions(+), 2 deletions(-) > > diff --git a/arch/arm/include/asm/types.h > b/arch/arm/include/asm/types.h index 388058e..d108915 100644 > --- a/arch/arm/include/asm/types.h > +++ b/arch/arm/include/asm/types.h > @@ -46,16 +46,29 @@ typedef unsigned long long u64; > #endif /* CONFIG_ARM64 */ > > #ifdef CONFIG_PHYS_64BIT > -typedef unsigned long long dma_addr_t; > typedef unsigned long long phys_addr_t; > typedef unsigned long long phys_size_t; > #else > /* DMA addresses are 32-bits wide */ > -typedef u32 dma_addr_t; > typedef unsigned long phys_addr_t; > typedef unsigned long phys_size_t; > #endif > > +/* > + * A dma_addr_t can hold any valid DMA address, i.e., any address > returned > + * by the DMA API. > + * > + * If the DMA API only uses 32-bit addresses, dma_addr_t need only > be 32 > + * bits wide. Bus addresses, e.g., PCI BARs, may be wider than 32 > bits, > + * but drivers do memory-mapped I/O to ioremapped kernel virtual > addresses, > + * so they don't care about the size of the actual bus addresses. > + */ > +#ifdef CONFIG_DMA_ADDR_T_64BIT Generally this approach is correct, but please pay attention to the CONFIG_PHYS_64BIT. The actual size of dma_addr_t (64 or 32 bits) is decided by defining or undefining CONFIG_PHYS_64BIT at arch/arm/include/asm/config.h. This is based on the status of CONFIG_ARM64. To avoid regression we need to take into account status of CONFIG_ARM64 to be sure that CONFIG_DMA_ADDR_T_64BIT is set on ARM64 systems. > +typedef unsigned long long dma_addr_t; > +#else > +typedef u32 dma_addr_t; > +#endif > + > #endif /* __KERNEL__ */ > > typedef unsigned long resource_size_t; -- Best regards, Lukasz Majewski Samsung R&D Institute Poland (SRPOL) | Linux Platform Group _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot