/* 16MB ISA DMA zone */
 #define MAX_DMA_PFN   ((16 * 1024 * 1024) >> PAGE_SHIFT)
 
-#ifdef CONFIG_X86_32
+/* 4GB broken PCI/AGP hardware bus master zone */
+#define MAX_DMA32_PFN ((4UL * 1024 * 1024 * 1024) >> PAGE_SHIFT)
 
+#ifdef CONFIG_X86_32
 /* The maximum address that we can perform a DMA transfer to on this platform */
 #define MAX_DMA_ADDRESS      (PAGE_OFFSET + 0x1000000)
-
 #else
-
-/* 4GB broken PCI/AGP hardware bus master zone */
-#define MAX_DMA32_PFN ((4UL * 1024 * 1024 * 1024) >> PAGE_SHIFT)
-
 /* Compat define for old dma zone */
 #define MAX_DMA_ADDRESS ((unsigned long)__va(MAX_DMA_PFN << PAGE_SHIFT))
-
 #endif
 
 /* 8237 DMA controllers */
 
 #include <linux/errno.h>
 #include <linux/topology.h>
 #include <linux/memblock.h>
+#include <linux/bootmem.h>
 #include <asm/dma.h>
 
 #include "numa_internal.h"
                nr_nodes = MAX_NUMNODES;
        }
 
-       size = (max_addr - addr - memblock_x86_hole_size(addr, max_addr)) / nr_nodes;
+       /*
+        * Calculate target node size.  x86_32 freaks on __udivdi3() so do
+        * the division in ulong number of pages and convert back.
+        */
+       size = max_addr - addr - memblock_x86_hole_size(addr, max_addr);
+       size = PFN_PHYS((unsigned long)(size >> PAGE_SHIFT) / nr_nodes);
+
        /*
         * Calculate the number of big nodes that can be allocated as a result
         * of consolidating the remainder.
         */
        while (nodes_weight(physnode_mask)) {
                for_each_node_mask(i, physnode_mask) {
-                       u64 dma32_end = MAX_DMA32_PFN << PAGE_SHIFT;
+                       u64 dma32_end = PFN_PHYS(MAX_DMA32_PFN);
                        u64 start, limit, end;
                        int phys_blk;
 
 {
        static struct numa_meminfo ei __initdata;
        static struct numa_meminfo pi __initdata;
-       const u64 max_addr = max_pfn << PAGE_SHIFT;
+       const u64 max_addr = PFN_PHYS(max_pfn);
        u8 *phys_dist = NULL;
        size_t phys_size = numa_dist_cnt * numa_dist_cnt * sizeof(phys_dist[0]);
        int max_emu_nid, dfl_phys_nid;
        if (numa_dist_cnt) {
                u64 phys;
 
-               phys = memblock_find_in_range(0,
-                                             (u64)max_pfn_mapped << PAGE_SHIFT,
+               phys = memblock_find_in_range(0, PFN_PHYS(max_pfn_mapped),
                                              phys_size, PAGE_SIZE);
                if (phys == MEMBLOCK_ERROR) {
                        pr_warning("NUMA: Warning: can't allocate copy of distance table, disabling emulation\n");