/* We allocate a struct bootmem_data for each piece of memory that we wish to treat as a virtually contiguous block (i.e. each node). Each such block must start on an IA64_GRANULE_SIZE boundary, so we round the address down if necessary. Any non-existent pages will simply be part of the virtual memmap. We also update min_low_pfn and max_low_pfn here as we receive memory ranges from the caller.  */
static int __init build_node_maps(unsigned long start, unsigned long len, int node)
/* We allocate a struct bootmem_data for each piece of memory that we wish to treat as a virtually contiguous block (i.e. each node). Each such block must start on an IA64_GRANULE_SIZE boundary, so we round the address down if necessary. Any non-existent pages will simply be part of the virtual memmap. We also update min_low_pfn and max_low_pfn here as we receive memory ranges from the caller.  */
static int __init build_node_maps(unsigned long start, unsigned long len, int node)
{
	unsigned long spfn, epfn, end = start + len;
	struct bootmem_data *bdp = &bootmem_node_data[node];
	epfn = GRANULEROUNDUP(end) >> PAGE_SHIFT;
	spfn = GRANULEROUNDDOWN(start) >> PAGE_SHIFT;
	if (!bdp->node_low_pfn) {
		bdp->node_min_pfn = spfn;
		bdp->node_low_pfn = epfn;
	} else {
		bdp->node_min_pfn = min(spfn, bdp->node_min_pfn);
		bdp->node_low_pfn = max(epfn, bdp->node_low_pfn);
	}
	return 0;
}