bootmem.h 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /*
  3. * Discontiguous memory support, Kanoj Sarcar, SGI, Nov 1999
  4. */
  5. #ifndef _LINUX_BOOTMEM_H
  6. #define _LINUX_BOOTMEM_H
  7. #include <linux/mmzone.h>
  8. #include <linux/mm_types.h>
  9. #include <asm/dma.h>
  10. #include <asm/processor.h>
  11. /*
  12. * simple boot-time physical memory area allocator.
  13. */
  14. extern unsigned long max_low_pfn;
  15. extern unsigned long min_low_pfn;
  16. /*
  17. * highest page
  18. */
  19. extern unsigned long max_pfn;
  20. /*
  21. * highest possible page
  22. */
  23. extern unsigned long long max_possible_pfn;
  24. extern unsigned long memblock_free_all(void);
  25. extern void reset_node_managed_pages(pg_data_t *pgdat);
  26. extern void reset_all_zones_managed_pages(void);
  27. /* We are using top down, so it is safe to use 0 here */
  28. #define BOOTMEM_LOW_LIMIT 0
  29. #ifndef ARCH_LOW_ADDRESS_LIMIT
  30. #define ARCH_LOW_ADDRESS_LIMIT 0xffffffffUL
  31. #endif
  32. /* FIXME: use MEMBLOCK_ALLOC_* variants here */
  33. #define BOOTMEM_ALLOC_ACCESSIBLE 0
  34. #define BOOTMEM_ALLOC_ANYWHERE (~(phys_addr_t)0)
  35. /* FIXME: Move to memblock.h at a point where we remove nobootmem.c */
  36. void *memblock_alloc_try_nid_raw(phys_addr_t size, phys_addr_t align,
  37. phys_addr_t min_addr,
  38. phys_addr_t max_addr, int nid);
  39. void *memblock_alloc_try_nid_nopanic(phys_addr_t size,
  40. phys_addr_t align, phys_addr_t min_addr,
  41. phys_addr_t max_addr, int nid);
  42. void *memblock_alloc_try_nid(phys_addr_t size, phys_addr_t align,
  43. phys_addr_t min_addr, phys_addr_t max_addr, int nid);
  44. void __memblock_free_early(phys_addr_t base, phys_addr_t size);
  45. void __memblock_free_late(phys_addr_t base, phys_addr_t size);
  46. static inline void * __init memblock_alloc(
  47. phys_addr_t size, phys_addr_t align)
  48. {
  49. return memblock_alloc_try_nid(size, align, BOOTMEM_LOW_LIMIT,
  50. BOOTMEM_ALLOC_ACCESSIBLE,
  51. NUMA_NO_NODE);
  52. }
  53. static inline void * __init memblock_alloc_raw(
  54. phys_addr_t size, phys_addr_t align)
  55. {
  56. return memblock_alloc_try_nid_raw(size, align, BOOTMEM_LOW_LIMIT,
  57. BOOTMEM_ALLOC_ACCESSIBLE,
  58. NUMA_NO_NODE);
  59. }
  60. static inline void * __init memblock_alloc_from(
  61. phys_addr_t size, phys_addr_t align, phys_addr_t min_addr)
  62. {
  63. return memblock_alloc_try_nid(size, align, min_addr,
  64. BOOTMEM_ALLOC_ACCESSIBLE,
  65. NUMA_NO_NODE);
  66. }
  67. static inline void * __init memblock_alloc_nopanic(
  68. phys_addr_t size, phys_addr_t align)
  69. {
  70. return memblock_alloc_try_nid_nopanic(size, align,
  71. BOOTMEM_LOW_LIMIT,
  72. BOOTMEM_ALLOC_ACCESSIBLE,
  73. NUMA_NO_NODE);
  74. }
  75. static inline void * __init memblock_alloc_low(
  76. phys_addr_t size, phys_addr_t align)
  77. {
  78. return memblock_alloc_try_nid(size, align,
  79. BOOTMEM_LOW_LIMIT,
  80. ARCH_LOW_ADDRESS_LIMIT,
  81. NUMA_NO_NODE);
  82. }
  83. static inline void * __init memblock_alloc_low_nopanic(
  84. phys_addr_t size, phys_addr_t align)
  85. {
  86. return memblock_alloc_try_nid_nopanic(size, align,
  87. BOOTMEM_LOW_LIMIT,
  88. ARCH_LOW_ADDRESS_LIMIT,
  89. NUMA_NO_NODE);
  90. }
  91. static inline void * __init memblock_alloc_from_nopanic(
  92. phys_addr_t size, phys_addr_t align, phys_addr_t min_addr)
  93. {
  94. return memblock_alloc_try_nid_nopanic(size, align, min_addr,
  95. BOOTMEM_ALLOC_ACCESSIBLE,
  96. NUMA_NO_NODE);
  97. }
  98. static inline void * __init memblock_alloc_node(
  99. phys_addr_t size, phys_addr_t align, int nid)
  100. {
  101. return memblock_alloc_try_nid(size, align, BOOTMEM_LOW_LIMIT,
  102. BOOTMEM_ALLOC_ACCESSIBLE, nid);
  103. }
  104. static inline void * __init memblock_alloc_node_nopanic(
  105. phys_addr_t size, int nid)
  106. {
  107. return memblock_alloc_try_nid_nopanic(size, 0, BOOTMEM_LOW_LIMIT,
  108. BOOTMEM_ALLOC_ACCESSIBLE,
  109. nid);
  110. }
  111. static inline void __init memblock_free_early(
  112. phys_addr_t base, phys_addr_t size)
  113. {
  114. __memblock_free_early(base, size);
  115. }
  116. static inline void __init memblock_free_early_nid(
  117. phys_addr_t base, phys_addr_t size, int nid)
  118. {
  119. __memblock_free_early(base, size);
  120. }
  121. static inline void __init memblock_free_late(
  122. phys_addr_t base, phys_addr_t size)
  123. {
  124. __memblock_free_late(base, size);
  125. }
  126. extern void *alloc_large_system_hash(const char *tablename,
  127. unsigned long bucketsize,
  128. unsigned long numentries,
  129. int scale,
  130. int flags,
  131. unsigned int *_hash_shift,
  132. unsigned int *_hash_mask,
  133. unsigned long low_limit,
  134. unsigned long high_limit);
  135. #define HASH_EARLY 0x00000001 /* Allocating during early boot? */
  136. #define HASH_SMALL 0x00000002 /* sub-page allocation allowed, min
  137. * shift passed via *_hash_shift */
  138. #define HASH_ZERO 0x00000004 /* Zero allocated hash table */
  139. /* Only NUMA needs hash distribution. 64bit NUMA architectures have
  140. * sufficient vmalloc space.
  141. */
  142. #ifdef CONFIG_NUMA
  143. #define HASHDIST_DEFAULT IS_ENABLED(CONFIG_64BIT)
  144. extern int hashdist; /* Distribute hashes across NUMA nodes? */
  145. #else
  146. #define hashdist (0)
  147. #endif
  148. #endif /* _LINUX_BOOTMEM_H */