home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / arch / powerpc / include / asm / fixmap.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  3.1 KB  |  107 lines

  1. /*
  2.  * fixmap.h: compile-time virtual memory allocation
  3.  *
  4.  * This file is subject to the terms and conditions of the GNU General Public
  5.  * License.  See the file "COPYING" in the main directory of this archive
  6.  * for more details.
  7.  *
  8.  * Copyright (C) 1998 Ingo Molnar
  9.  *
  10.  * Copyright 2008 Freescale Semiconductor Inc.
  11.  *   Port to powerpc added by Kumar Gala
  12.  */
  13.  
  14. #ifndef _ASM_FIXMAP_H
  15. #define _ASM_FIXMAP_H
  16.  
  17. extern unsigned long FIXADDR_TOP;
  18.  
  19. #ifndef __ASSEMBLY__
  20. #include <linux/kernel.h>
  21. #include <asm/page.h>
  22. #ifdef CONFIG_HIGHMEM
  23. #include <linux/threads.h>
  24. #include <asm/kmap_types.h>
  25. #endif
  26.  
  27. /*
  28.  * Here we define all the compile-time 'special' virtual
  29.  * addresses. The point is to have a constant address at
  30.  * compile time, but to set the physical address only
  31.  * in the boot process. We allocate these special addresses
  32.  * from the end of virtual memory (0xfffff000) backwards.
  33.  * Also this lets us do fail-safe vmalloc(), we
  34.  * can guarantee that these special addresses and
  35.  * vmalloc()-ed addresses never overlap.
  36.  *
  37.  * these 'compile-time allocated' memory buffers are
  38.  * fixed-size 4k pages. (or larger if used with an increment
  39.  * highger than 1) use fixmap_set(idx,phys) to associate
  40.  * physical memory with fixmap indices.
  41.  *
  42.  * TLB entries of such buffers will not be flushed across
  43.  * task switches.
  44.  */
  45. enum fixed_addresses {
  46.     FIX_HOLE,
  47. #ifdef CONFIG_HIGHMEM
  48.     FIX_KMAP_BEGIN,    /* reserved pte's for temporary kernel mappings */
  49.     FIX_KMAP_END = FIX_KMAP_BEGIN+(KM_TYPE_NR*NR_CPUS)-1,
  50. #endif
  51.     /* FIX_PCIE_MCFG, */
  52.     __end_of_fixed_addresses
  53. };
  54.  
  55. extern void __set_fixmap (enum fixed_addresses idx,
  56.                     phys_addr_t phys, pgprot_t flags);
  57.  
  58. #define set_fixmap(idx, phys) \
  59.         __set_fixmap(idx, phys, PAGE_KERNEL)
  60. /*
  61.  * Some hardware wants to get fixmapped without caching.
  62.  */
  63. #define set_fixmap_nocache(idx, phys) \
  64.         __set_fixmap(idx, phys, PAGE_KERNEL_NOCACHE)
  65.  
  66. #define clear_fixmap(idx) \
  67.         __set_fixmap(idx, 0, __pgprot(0))
  68.  
  69. #define __FIXADDR_SIZE    (__end_of_fixed_addresses << PAGE_SHIFT)
  70. #define FIXADDR_START        (FIXADDR_TOP - __FIXADDR_SIZE)
  71.  
  72. #define __fix_to_virt(x)    (FIXADDR_TOP - ((x) << PAGE_SHIFT))
  73. #define __virt_to_fix(x)    ((FIXADDR_TOP - ((x)&PAGE_MASK)) >> PAGE_SHIFT)
  74.  
  75. extern void __this_fixmap_does_not_exist(void);
  76.  
  77. /*
  78.  * 'index to address' translation. If anyone tries to use the idx
  79.  * directly without tranlation, we catch the bug with a NULL-deference
  80.  * kernel oops. Illegal ranges of incoming indices are caught too.
  81.  */
  82. static __always_inline unsigned long fix_to_virt(const unsigned int idx)
  83. {
  84.     /*
  85.      * this branch gets completely eliminated after inlining,
  86.      * except when someone tries to use fixaddr indices in an
  87.      * illegal way. (such as mixing up address types or using
  88.      * out-of-range indices).
  89.      *
  90.      * If it doesn't get removed, the linker will complain
  91.      * loudly with a reasonably clear error message..
  92.      */
  93.     if (idx >= __end_of_fixed_addresses)
  94.         __this_fixmap_does_not_exist();
  95.  
  96.         return __fix_to_virt(idx);
  97. }
  98.  
  99. static inline unsigned long virt_to_fix(const unsigned long vaddr)
  100. {
  101.     BUG_ON(vaddr >= FIXADDR_TOP || vaddr < FIXADDR_START);
  102.     return __virt_to_fix(vaddr);
  103. }
  104.  
  105. #endif /* !__ASSEMBLY__ */
  106. #endif
  107.