mmzone.h 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  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_mem_map(nid) (NODE_DATA(nid)->node_mem_map)
  50. #define node_start_pfn(nid) (NODE_DATA(nid)->node_start_pfn)
  51. #define local_mapnr(kvaddr) \
  52. ((__pa(kvaddr) >> PAGE_SHIFT) - node_start_pfn(kvaddr_to_nid(kvaddr)))
  53. /*
  54. * Given a kaddr, LOCAL_BASE_ADDR finds the owning node of the memory
  55. * and returns the kaddr corresponding to first physical page in the
  56. * node's mem_map.
  57. */
  58. #define LOCAL_BASE_ADDR(kaddr) \
  59. ((unsigned long)__va(NODE_DATA(kvaddr_to_nid(kaddr))->node_start_pfn \
  60. << PAGE_SHIFT))
  61. /* XXX: FIXME -- wli */
  62. #define kern_addr_valid(kaddr) (0)
  63. #define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)
  64. #define VALID_PAGE(page) (((page) - mem_map) < max_mapnr)
  65. #define pmd_page(pmd) (pfn_to_page(pmd_val(pmd) >> 32))
  66. #define pte_pfn(pte) (pte_val(pte) >> 32)
  67. #define mk_pte(page, pgprot) \
  68. ({ \
  69. pte_t pte; \
  70. unsigned long pfn; \
  71. \
  72. pfn = ((unsigned long)((page)-page_zone(page)->zone_mem_map)) << 32; \
  73. pfn += page_zone(page)->zone_start_pfn << 32; \
  74. pte_val(pte) = pfn | pgprot_val(pgprot); \
  75. \
  76. pte; \
  77. })
  78. #define pte_page(x) \
  79. ({ \
  80. unsigned long kvirt; \
  81. struct page * __xx; \
  82. \
  83. kvirt = (unsigned long)__va(pte_val(x) >> (32-PAGE_SHIFT)); \
  84. __xx = virt_to_page(kvirt); \
  85. \
  86. __xx; \
  87. })
  88. #define pfn_to_page(pfn) \
  89. ({ \
  90. unsigned long kaddr = (unsigned long)__va((pfn) << PAGE_SHIFT); \
  91. (node_mem_map(kvaddr_to_nid(kaddr)) + local_mapnr(kaddr)); \
  92. })
  93. #define page_to_pfn(page) \
  94. ((page) - page_zone(page)->zone_mem_map + \
  95. (page_zone(page)->zone_start_pfn))
  96. #define page_to_pa(page) \
  97. ((( (page) - page_zone(page)->zone_mem_map ) \
  98. + page_zone(page)->zone_start_pfn) << PAGE_SHIFT)
  99. #define pfn_to_nid(pfn) pa_to_nid(((u64)(pfn) << PAGE_SHIFT))
  100. #define pfn_valid(pfn) \
  101. (((pfn) - node_start_pfn(pfn_to_nid(pfn))) < \
  102. node_spanned_pages(pfn_to_nid(pfn))) \
  103. #define virt_addr_valid(kaddr) pfn_valid((__pa(kaddr) >> PAGE_SHIFT))
  104. #endif /* CONFIG_DISCONTIGMEM */
  105. #endif /* _ASM_MMZONE_H_ */