From mboxrd@z Thu Jan 1 00:00:00 1970 From: Lokesh Vutla Date: Thu, 24 Mar 2016 14:33:42 +0530 Subject: [U-Boot] [RFC PATCH] ARM: asm: types: Introduce DMA_ADDR_T_64BIT In-Reply-To: <20160324094142.27282f4b@amdc2363> References: <1458797172-7031-1-git-send-email-lokeshvutla@ti.com> <20160324094142.27282f4b@amdc2363> Message-ID: <56F3AD6E.7000607@ti.com> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de On Thursday 24 March 2016 02:11 PM, Lukasz Majewski wrote: > 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 >> --- >> 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. Good point. So we need to select DMA_ADDR_T_64BIT by default for all ARM64 systems. I guess the below diff should be sufficient along with the $subject patch? diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index e5f57ef..550ecde 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig @@ -7,6 +7,10 @@ config SYS_ARCH config ARM64 bool +config DMA_ADDR_T_64BIT + bool + default y if ARM64 + config HAS_VBAR bool Thanks and regards, Lokesh > >> +typedef unsigned long long dma_addr_t; >> +#else >> +typedef u32 dma_addr_t; >> +#endif >> + >> #endif /* __KERNEL__ */ >> >> typedef unsigned long resource_size_t; > > >