From: Jeremy Fitzhardinge Add a kernel-wide "phys_addr_t" which is guaranteed to be able to hold any physical address. By default it equals the word size of the architecture, but a 32-bit architecture can set ARCH_PHYS_ADDR_T_64BIT if it needs a 64-bit phys_addr_t. Signed-off-by: Jeremy Fitzhardinge Cc: Paul Mackerras Cc: Benjamin Herrenschmidt Cc: Ingo Molnar Cc: Thomas Gleixner Cc: Eduardo Habkost Cc: Hirokazu Takata Signed-off-by: Andrew Morton --- arch/powerpc/Kconfig | 3 +++ arch/powerpc/include/asm/types.h | 7 ------- arch/x86/Kconfig | 3 +++ include/asm-x86/page_32.h | 2 -- include/asm-x86/page_64.h | 1 - include/linux/types.h | 6 ++++++ mm/Kconfig | 3 +++ 7 files changed, 15 insertions(+), 10 deletions(-) diff -puN arch/powerpc/Kconfig~add-phys_addr_t-for-holding-physical-addresses arch/powerpc/Kconfig --- a/arch/powerpc/Kconfig~add-phys_addr_t-for-holding-physical-addresses +++ a/arch/powerpc/Kconfig @@ -22,6 +22,9 @@ config WORD_SIZE config PPC_MERGE def_bool y +config ARCH_PHYS_ADDR_T_64BIT + def_bool PPC64 || PHYS_64BIT + config MMU bool default y diff -puN arch/powerpc/include/asm/types.h~add-phys_addr_t-for-holding-physical-addresses arch/powerpc/include/asm/types.h --- a/arch/powerpc/include/asm/types.h~add-phys_addr_t-for-holding-physical-addresses +++ a/arch/powerpc/include/asm/types.h @@ -48,13 +48,6 @@ typedef struct { typedef __vector128 vector128; -/* Physical address used by some IO functions */ -#if defined(CONFIG_PPC64) || defined(CONFIG_PHYS_64BIT) -typedef u64 phys_addr_t; -#else -typedef u32 phys_addr_t; -#endif - #ifdef __powerpc64__ typedef u64 dma_addr_t; #else diff -puN arch/x86/Kconfig~add-phys_addr_t-for-holding-physical-addresses arch/x86/Kconfig --- a/arch/x86/Kconfig~add-phys_addr_t-for-holding-physical-addresses +++ a/arch/x86/Kconfig @@ -969,6 +969,9 @@ config X86_PAE has the cost of more pagetable lookup overhead, and also consumes more pagetable space per process. +config ARCH_PHYS_ADDR_T_64BIT + def_bool X86_64 || X86_PAE + # Common NUMA Features config NUMA bool "Numa Memory Allocation and Scheduler Support (EXPERIMENTAL)" diff -puN include/asm-x86/page_32.h~add-phys_addr_t-for-holding-physical-addresses include/asm-x86/page_32.h --- a/include/asm-x86/page_32.h~add-phys_addr_t-for-holding-physical-addresses +++ a/include/asm-x86/page_32.h @@ -33,7 +33,6 @@ typedef u64 pmdval_t; typedef u64 pudval_t; typedef u64 pgdval_t; typedef u64 pgprotval_t; -typedef u64 phys_addr_t; typedef union { struct { @@ -54,7 +53,6 @@ typedef unsigned long pmdval_t; typedef unsigned long pudval_t; typedef unsigned long pgdval_t; typedef unsigned long pgprotval_t; -typedef unsigned long phys_addr_t; typedef union { pteval_t pte; diff -puN include/asm-x86/page_64.h~add-phys_addr_t-for-holding-physical-addresses include/asm-x86/page_64.h --- a/include/asm-x86/page_64.h~add-phys_addr_t-for-holding-physical-addresses +++ a/include/asm-x86/page_64.h @@ -79,7 +79,6 @@ typedef unsigned long pmdval_t; typedef unsigned long pudval_t; typedef unsigned long pgdval_t; typedef unsigned long pgprotval_t; -typedef unsigned long phys_addr_t; typedef struct page *pgtable_t; diff -puN include/linux/types.h~add-phys_addr_t-for-holding-physical-addresses include/linux/types.h --- a/include/linux/types.h~add-phys_addr_t-for-holding-physical-addresses +++ a/include/linux/types.h @@ -197,6 +197,12 @@ typedef u64 resource_size_t; typedef u32 resource_size_t; #endif +#ifdef CONFIG_PHYS_ADDR_T_64BIT +typedef u64 phys_addr_t; +#else +typedef u32 phys_addr_t; +#endif + struct ustat { __kernel_daddr_t f_tfree; __kernel_ino_t f_tinode; diff -puN mm/Kconfig~add-phys_addr_t-for-holding-physical-addresses mm/Kconfig --- a/mm/Kconfig~add-phys_addr_t-for-holding-physical-addresses +++ a/mm/Kconfig @@ -187,6 +187,9 @@ config RESOURCES_64BIT help This option allows memory and IO resources to be 64 bit. +config PHYS_ADDR_T_64BIT + def_bool 64BIT || ARCH_PHYS_ADDR_T_64BIT + config ZONE_DMA_FLAG int default "0" if !ZONE_DMA _