===================================================================
@@ -752,6 +752,15 @@ u64 __init find_fw_memmap_area(u64 start
{
return find_e820_area(start, end, size, align);
}
+
+u64 __init get_max_mapped(void)
+{
+ u64 end = max_pfn_mapped;
+
+ end <<= PAGE_SHIFT;
+
+ return end;
+}
/*
* Find next free range after *start
*/
===================================================================
@@ -13,6 +13,7 @@ u64 find_early_area(u64 ei_start, u64 ei
u64 find_early_area_size(u64 ei_start, u64 ei_last, u64 start,
u64 *sizep, u64 align);
u64 find_fw_memmap_area(u64 start, u64 end, u64 size, u64 align);
+u64 get_max_mapped(void);
#include <linux/range.h>
int get_free_all_memory_range(struct range **rangep, int nodeid);
===================================================================
@@ -184,6 +184,13 @@ u64 __init __weak find_fw_memmap_area(u6
return -1ULL;
}
+u64 __init __weak get_max_mapped(void)
+{
+ panic("should have get_max_mapped defined with arch");
+
+ return -1ULL;
+}
+
static void __init __check_and_double_early_res(u64 ex_start, u64 ex_end)
{
u64 start, end, size, mem;
@@ -206,7 +213,7 @@ static void __init __check_and_double_ea
sizeof(struct early_res));
if (mem == -1ULL) {
start = ex_end;
- end = max_pfn_mapped << PAGE_SHIFT;
+ end = get_max_mapped();
if (start + size < end)
mem = find_fw_memmap_area(start, end, size,
sizeof(struct early_res));
@@ -342,11 +349,11 @@ int __init get_free_all_memory_range(str
count *= 2;
size = sizeof(struct range) * count;
+ end = get_max_mapped();
#ifdef MAX_DMA32_PFN
- if (max_pfn_mapped > MAX_DMA32_PFN)
+ if (end > (MAX_DMA32_PFN << PAGE_SHIFT))
start = MAX_DMA32_PFN << PAGE_SHIFT;
#endif
- end = max_pfn_mapped << PAGE_SHIFT;
mem = find_fw_memmap_area(start, end, size, sizeof(struct range));
if (mem == -1ULL)
panic("can not find more space for range free");