mmzone.h 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. /*
  2. * Written by Kanoj Sarcar (kanoj@sgi.com) Aug 99
  3. * Adapted for the alpha wildfire architecture Jan 2001.
  4. */
  5. #ifndef _ASM_MMZONE_H_
  6. #define _ASM_MMZONE_H_
  7. #include <linux/config.h>
  8. #include <asm/smp.h>
  9. struct bootmem_data_t; /* stupid forward decl. */
  10. /*
  11. * Following are macros that are specific to this numa platform.
  12. */
  13. extern pg_data_t node_data[];
  14. #define alpha_pa_to_nid(pa) \
  15. (alpha_mv.pa_to_nid \
  16. ? alpha_mv.pa_to_nid(pa) \
  17. : (0))
  18. #define node_mem_start(nid) \
  19. (alpha_mv.node_mem_start \
  20. ? alpha_mv.node_mem_start(nid) \
  21. : (0UL))
  22. #define node_mem_size(nid) \
  23. (alpha_mv.node_mem_size \
  24. ? alpha_mv.node_mem_size(nid) \
  25. : ((nid) ? (0UL) : (~0UL)))
  26. #define pa_to_nid(pa) alpha_pa_to_nid(pa)
  27. #define NODE_DATA(nid) (&node_data[(nid)])
  28. #define node_localnr(pfn, nid) ((pfn) - NODE_DATA(nid)->node_start_pfn)
  29. #if 1
  30. #define PLAT_NODE_DATA_LOCALNR(p, n) \
  31. (((p) >> PAGE_SHIFT) - PLAT_NODE_DATA(n)->gendata.node_start_pfn)
  32. #else
  33. static inline unsigned long
  34. PLAT_NODE_DATA_LOCALNR(unsigned long p, int n)
  35. {
  36. unsigned long temp;
  37. temp = p >> PAGE_SHIFT;
  38. return temp - PLAT_NODE_DATA(n)->gendata.node_start_pfn;
  39. }
  40. #endif
  41. #ifdef CONFIG_DISCONTIGMEM
  42. /*
  43. * Following are macros that each numa implementation must define.
  44. */
  45. /*
  46. * Given a kernel address, find the home node of the underlying memory.
  47. */
  48. #define kvaddr_to_nid(kaddr) pa_to_nid(__pa(kaddr))
  49. #define node_start_pfn(nid) (NODE_DATA(nid)->node_start_pfn)
  50. /*
  51. * Given a kaddr, LOCAL_BASE_ADDR finds the owning node of the memory
  52. * and returns the kaddr corresponding to first physical page in the
  53. * node's mem_map.
  54. */
  55. #define LOCAL_BASE_ADDR(kaddr) \
  56. ((unsigned long)__va(NODE_DATA(kvaddr_to_nid(kaddr))->node_start_pfn \
  57. << PAGE_SHIFT))
  58. /* XXX: FIXME -- wli */
  59. #define kern_addr_valid(kaddr) (0)
  60. #define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)
  61. #define VALID_PAGE(page) (((page) - mem_map) < max_mapnr)
  62. #define pmd_page(pmd) (pfn_to_page(pmd_val(pmd) >> 32))
  63. #define pte_pfn(pte) (pte_val(pte) >> 32)
  64. #define mk_pte(page, pgprot) \
  65. ({ \
  66. pte_t pte; \
  67. unsigned long pfn; \
  68. \
  69. pfn = page_to_pfn(page) << 32; \
  70. pte_val(pte) = pfn | pgprot_val(pgprot); \
  71. \
  72. pte; \
  73. })
  74. #define pte_page(x) \
  75. ({ \
  76. unsigned long kvirt; \
  77. struct page * __xx; \
  78. \
  79. kvirt = (unsigned long)__va(pte_val(x) >> (32-PAGE_SHIFT)); \
  80. __xx = virt_to_page(kvirt); \
  81. \
  82. __xx; \
  83. })
  84. #define page_to_pa(page) \
  85. (page_to_pfn(page) << PAGE_SHIFT)
  86. #define pfn_to_nid(pfn) pa_to_nid(((u64)(pfn) << PAGE_SHIFT))
  87. #define pfn_valid(pfn) \
  88. (((pfn) - node_start_pfn(pfn_to_nid(pfn))) < \
  89. node_spanned_pages(pfn_to_nid(pfn))) \
  90. #define virt_addr_valid(kaddr) pfn_valid((__pa(kaddr) >> PAGE_SHIFT))
  91. #endif /* CONFIG_DISCONTIGMEM */
  92. #endif /* _ASM_MMZONE_H_ */