 a0e4467726
			
		
	
	
	a0e4467726
	
	
	
		
			
			While there normally is no reason to have a pull request for asm-generic
 but have all changes get merged through whichever tree needs them, I do
 have a series for 3.19. There are two sets of patches that change
 significant portions of asm/io.h, and this branch contains both in order
 to resolve the conflicts:
 
 - Will Deacon has done a set of patches to ensure that all architectures
   define {read,write}{b,w,l,q}_relaxed() functions or get them by
   including asm-generic/io.h. These functions are commonly used on ARM
   specific drivers to avoid expensive L2 cache synchronization implied by
   the normal {read,write}{b,w,l,q}, but we need to define them on all
   architectures in order to share the drivers across architectures and
   to enable CONFIG_COMPILE_TEST configurations for them
 
 - Thierry Reding has done an unrelated set of patches that extends
   the asm-generic/io.h file to the degree necessary to make it useful
   on ARM64 and potentially other architectures.
 -----BEGIN PGP SIGNATURE-----
 Version: GnuPG v1.4.12 (GNU/Linux)
 
 iQIVAwUAVIdwNmCrR//JCVInAQJWuw/9FHt2ThMnI1J1Jqy4CVwtyjWTSa6Y/uVj
 xSytS7AOvmU/nw1quSoba5mN9fcUQUtK9kqjqNcq71WsQcDE6BF9SFpi9cWtjWcI
 ZfWsC+5kqry/mbnuHefENipem9RqBrLbOBJ3LARf5M8rZJuTz1KbdZs9r9+1QsCX
 ou8jeqVvNKUn9J1WyekJBFSrPOtZ4bCUpeyh23JHRfPtJeAHNOuPuymj6WceAz98
 uMV1icRaCBMySsf9HgsHRYW5HwuCm3MrrYj6ukyPpgxYz7FRq4hJLDs6GnlFtAGb
 71g87NpFdB32qbW+y1ntfYaJyUryMHMVHBWcV5H9m0btdHTRHYZjoOGOPuyLHHO8
 +l4/FaOQhnDL8cNDj0HKfhdlyaFylcWgs1wzj68nv31c1dGjcJcQiyCDwry9mJhr
 erh4EewcerUvWzbBMQ4JP1f8syKMsKwbo1bVU61a1RQJxEqVCzJMLweGSOFmqMX2
 6E4ZJVWv81UFLoFTzYx+7+M45K4NWywKNQdzwKmqKHc4OQyvq4ALJI0A7SGFJdDR
 HJ7VqDiLaSdBitgJcJUxNzKcyXij6wE9jE1fBe3YDFE4LrnZXFVLN+MX6hs7AIFJ
 vJM1UpxRxQUMGIH2m7rbDNazOAsvQGxINOjNor23cNLuf6qLY1LrpHVPQDAfJVvA
 6tROM77bwIQ=
 =xUv6
 -----END PGP SIGNATURE-----
Merge tag 'asm-generic-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/arnd/asm-generic
Pull asm-generic asm/io.h rewrite from Arnd Bergmann:
 "While there normally is no reason to have a pull request for
  asm-generic but have all changes get merged through whichever tree
  needs them, I do have a series for 3.19.
  There are two sets of patches that change significant portions of
  asm/io.h, and this branch contains both in order to resolve the
  conflicts:
   - Will Deacon has done a set of patches to ensure that all
     architectures define {read,write}{b,w,l,q}_relaxed() functions or
     get them by including asm-generic/io.h.
     These functions are commonly used on ARM specific drivers to avoid
     expensive L2 cache synchronization implied by the normal
     {read,write}{b,w,l,q}, but we need to define them on all
     architectures in order to share the drivers across architectures
     and to enable CONFIG_COMPILE_TEST configurations for them
   - Thierry Reding has done an unrelated set of patches that extends
     the asm-generic/io.h file to the degree necessary to make it useful
     on ARM64 and potentially other architectures"
* tag 'asm-generic-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/arnd/asm-generic: (29 commits)
  ARM64: use GENERIC_PCI_IOMAP
  sparc: io: remove duplicate relaxed accessors on sparc32
  ARM: sa11x0: Use void __iomem * in MMIO accessors
  arm64: Use include/asm-generic/io.h
  ARM: Use include/asm-generic/io.h
  asm-generic/io.h: Implement generic {read,write}s*()
  asm-generic/io.h: Reconcile I/O accessor overrides
  /dev/mem: Use more consistent data types
  Change xlate_dev_{kmem,mem}_ptr() prototypes
  ARM: ixp4xx: Properly override I/O accessors
  ARM: ixp4xx: Fix build with IXP4XX_INDIRECT_PCI
  ARM: ebsa110: Properly override I/O accessors
  ARC: Remove redundant PCI_IOBASE declaration
  documentation: memory-barriers: clarify relaxed io accessor semantics
  x86: io: implement dummy relaxed accessor macros for writes
  tile: io: implement dummy relaxed accessor macros for writes
  sparc: io: implement dummy relaxed accessor macros for writes
  powerpc: io: implement dummy relaxed accessor macros for writes
  parisc: io: implement dummy relaxed accessor macros for writes
  mn10300: io: implement dummy relaxed accessor macros for writes
  ...
		
	
			
		
			
				
	
	
		
			156 lines
		
	
	
	
		
			4.7 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			156 lines
		
	
	
	
		
			4.7 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * Based on arch/arm/include/asm/memory.h
 | |
|  *
 | |
|  * Copyright (C) 2000-2002 Russell King
 | |
|  * Copyright (C) 2012 ARM Ltd.
 | |
|  *
 | |
|  * This program is free software; you can redistribute it and/or modify
 | |
|  * it under the terms of the GNU General Public License version 2 as
 | |
|  * published by the Free Software Foundation.
 | |
|  *
 | |
|  * This program is distributed in the hope that it will be useful,
 | |
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
|  * GNU General Public License for more details.
 | |
|  *
 | |
|  * You should have received a copy of the GNU General Public License
 | |
|  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | |
|  *
 | |
|  * Note: this file should not be included by non-asm/.h files
 | |
|  */
 | |
| #ifndef __ASM_MEMORY_H
 | |
| #define __ASM_MEMORY_H
 | |
| 
 | |
| #include <linux/compiler.h>
 | |
| #include <linux/const.h>
 | |
| #include <linux/types.h>
 | |
| #include <asm/sizes.h>
 | |
| 
 | |
| /*
 | |
|  * Allow for constants defined here to be used from assembly code
 | |
|  * by prepending the UL suffix only with actual C code compilation.
 | |
|  */
 | |
| #define UL(x) _AC(x, UL)
 | |
| 
 | |
| /*
 | |
|  * PAGE_OFFSET - the virtual address of the start of the kernel image (top
 | |
|  *		 (VA_BITS - 1))
 | |
|  * VA_BITS - the maximum number of bits for virtual addresses.
 | |
|  * TASK_SIZE - the maximum size of a user space task.
 | |
|  * TASK_UNMAPPED_BASE - the lower boundary of the mmap VM area.
 | |
|  * The module space lives between the addresses given by TASK_SIZE
 | |
|  * and PAGE_OFFSET - it must be within 128MB of the kernel text.
 | |
|  */
 | |
| #define VA_BITS			(CONFIG_ARM64_VA_BITS)
 | |
| #define PAGE_OFFSET		(UL(0xffffffffffffffff) << (VA_BITS - 1))
 | |
| #define MODULES_END		(PAGE_OFFSET)
 | |
| #define MODULES_VADDR		(MODULES_END - SZ_64M)
 | |
| #define FIXADDR_TOP		(MODULES_VADDR - SZ_2M - PAGE_SIZE)
 | |
| #define TASK_SIZE_64		(UL(1) << VA_BITS)
 | |
| 
 | |
| #ifdef CONFIG_COMPAT
 | |
| #define TASK_SIZE_32		UL(0x100000000)
 | |
| #define TASK_SIZE		(test_thread_flag(TIF_32BIT) ? \
 | |
| 				TASK_SIZE_32 : TASK_SIZE_64)
 | |
| #define TASK_SIZE_OF(tsk)	(test_tsk_thread_flag(tsk, TIF_32BIT) ? \
 | |
| 				TASK_SIZE_32 : TASK_SIZE_64)
 | |
| #else
 | |
| #define TASK_SIZE		TASK_SIZE_64
 | |
| #endif /* CONFIG_COMPAT */
 | |
| 
 | |
| #define TASK_UNMAPPED_BASE	(PAGE_ALIGN(TASK_SIZE / 4))
 | |
| 
 | |
| #if TASK_SIZE_64 > MODULES_VADDR
 | |
| #error Top of 64-bit user space clashes with start of module space
 | |
| #endif
 | |
| 
 | |
| /*
 | |
|  * Physical vs virtual RAM address space conversion.  These are
 | |
|  * private definitions which should NOT be used outside memory.h
 | |
|  * files.  Use virt_to_phys/phys_to_virt/__pa/__va instead.
 | |
|  */
 | |
| #define __virt_to_phys(x)	(((phys_addr_t)(x) - PAGE_OFFSET + PHYS_OFFSET))
 | |
| #define __phys_to_virt(x)	((unsigned long)((x) - PHYS_OFFSET + PAGE_OFFSET))
 | |
| 
 | |
| /*
 | |
|  * Convert a physical address to a Page Frame Number and back
 | |
|  */
 | |
| #define	__phys_to_pfn(paddr)	((unsigned long)((paddr) >> PAGE_SHIFT))
 | |
| #define	__pfn_to_phys(pfn)	((phys_addr_t)(pfn) << PAGE_SHIFT)
 | |
| 
 | |
| /*
 | |
|  * Convert a page to/from a physical address
 | |
|  */
 | |
| #define page_to_phys(page)	(__pfn_to_phys(page_to_pfn(page)))
 | |
| #define phys_to_page(phys)	(pfn_to_page(__phys_to_pfn(phys)))
 | |
| 
 | |
| /*
 | |
|  * Memory types available.
 | |
|  */
 | |
| #define MT_DEVICE_nGnRnE	0
 | |
| #define MT_DEVICE_nGnRE		1
 | |
| #define MT_DEVICE_GRE		2
 | |
| #define MT_NORMAL_NC		3
 | |
| #define MT_NORMAL		4
 | |
| 
 | |
| /*
 | |
|  * Memory types for Stage-2 translation
 | |
|  */
 | |
| #define MT_S2_NORMAL		0xf
 | |
| #define MT_S2_DEVICE_nGnRE	0x1
 | |
| 
 | |
| #ifndef __ASSEMBLY__
 | |
| 
 | |
| extern phys_addr_t		memstart_addr;
 | |
| /* PHYS_OFFSET - the physical address of the start of memory. */
 | |
| #define PHYS_OFFSET		({ memstart_addr; })
 | |
| 
 | |
| /*
 | |
|  * PFNs are used to describe any physical page; this means
 | |
|  * PFN 0 == physical address 0.
 | |
|  *
 | |
|  * This is the PFN of the first RAM page in the kernel
 | |
|  * direct-mapped view.  We assume this is the first page
 | |
|  * of RAM in the mem_map as well.
 | |
|  */
 | |
| #define PHYS_PFN_OFFSET	(PHYS_OFFSET >> PAGE_SHIFT)
 | |
| 
 | |
| /*
 | |
|  * Note: Drivers should NOT use these.  They are the wrong
 | |
|  * translation for translating DMA addresses.  Use the driver
 | |
|  * DMA support - see dma-mapping.h.
 | |
|  */
 | |
| #define virt_to_phys virt_to_phys
 | |
| static inline phys_addr_t virt_to_phys(const volatile void *x)
 | |
| {
 | |
| 	return __virt_to_phys((unsigned long)(x));
 | |
| }
 | |
| 
 | |
| #define phys_to_virt phys_to_virt
 | |
| static inline void *phys_to_virt(phys_addr_t x)
 | |
| {
 | |
| 	return (void *)(__phys_to_virt(x));
 | |
| }
 | |
| 
 | |
| /*
 | |
|  * Drivers should NOT use these either.
 | |
|  */
 | |
| #define __pa(x)			__virt_to_phys((unsigned long)(x))
 | |
| #define __va(x)			((void *)__phys_to_virt((phys_addr_t)(x)))
 | |
| #define pfn_to_kaddr(pfn)	__va((pfn) << PAGE_SHIFT)
 | |
| #define virt_to_pfn(x)      __phys_to_pfn(__virt_to_phys(x))
 | |
| 
 | |
| /*
 | |
|  *  virt_to_page(k)	convert a _valid_ virtual address to struct page *
 | |
|  *  virt_addr_valid(k)	indicates whether a virtual address is valid
 | |
|  */
 | |
| #define ARCH_PFN_OFFSET		((unsigned long)PHYS_PFN_OFFSET)
 | |
| 
 | |
| #define virt_to_page(kaddr)	pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)
 | |
| #define	virt_addr_valid(kaddr)	pfn_valid(__pa(kaddr) >> PAGE_SHIFT)
 | |
| 
 | |
| #endif
 | |
| 
 | |
| #include <asm-generic/memory_model.h>
 | |
| 
 | |
| #endif
 |