[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH 30/37] xen/arm: introduce a helper to parse device tree memory node
Memory blocks' NUMA ID information is stored in device tree's memory nodes as "numa-node-id". We need a new helper to parse and verify this ID from memory nodes. Signed-off-by: Wei Chen <wei.chen@xxxxxxx> --- xen/arch/arm/numa_device_tree.c | 80 +++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) diff --git a/xen/arch/arm/numa_device_tree.c b/xen/arch/arm/numa_device_tree.c index 2428fbae0b..7918a397fa 100644 --- a/xen/arch/arm/numa_device_tree.c +++ b/xen/arch/arm/numa_device_tree.c @@ -42,6 +42,35 @@ static int __init fdt_numa_processor_affinity_init(nodeid_t node) return 0; } +/* Callback for parsing of the memory regions affinity */ +static int __init fdt_numa_memory_affinity_init(nodeid_t node, + paddr_t start, paddr_t size) +{ + int ret; + + if ( srat_disabled() ) + { + return -EINVAL; + } + + if ( !numa_memblks_available() ) + { + dprintk(XENLOG_WARNING, + "Too many numa entry, try bigger NR_NODE_MEMBLKS \n"); + bad_srat(); + return -EINVAL; + } + + ret = numa_update_node_memblks(node, start, size, false); + if ( ret != 0 ) + { + bad_srat(); + return -EINVAL; + } + + return 0; +} + /* Parse CPU NUMA node info */ static int __init fdt_parse_numa_cpu_node(const void *fdt, int node) { @@ -56,3 +85,54 @@ static int __init fdt_parse_numa_cpu_node(const void *fdt, int node) return fdt_numa_processor_affinity_init(nid); } + +/* Parse memory node NUMA info */ +static int __init fdt_parse_numa_memory_node(const void *fdt, int node, + const char *name, uint32_t addr_cells, uint32_t size_cells) +{ + uint32_t nid; + int ret = 0, len; + paddr_t addr, size; + const struct fdt_property *prop; + uint32_t idx, ranges; + const __be32 *addresses; + + nid = device_tree_get_u32(fdt, node, "numa-node-id", MAX_NUMNODES); + if ( nid >= MAX_NUMNODES ) + { + printk(XENLOG_WARNING "Node id %u exceeds maximum value\n", nid); + return -EINVAL; + } + + prop = fdt_get_property(fdt, node, "reg", &len); + if ( !prop ) + { + printk(XENLOG_WARNING + "fdt: node `%s': missing `reg' property\n", name); + return -EINVAL; + } + + addresses = (const __be32 *)prop->data; + ranges = len / (sizeof(__be32)* (addr_cells + size_cells)); + for ( idx = 0; idx < ranges; idx++ ) + { + device_tree_get_reg(&addresses, addr_cells, size_cells, &addr, &size); + /* Skip zero size ranges */ + if ( !size ) + continue; + + ret = fdt_numa_memory_affinity_init(nid, addr, size); + if ( ret ) { + return -EINVAL; + } + } + + if ( idx == 0 ) + { + printk(XENLOG_ERR + "bad property in memory node, idx=%d ret=%d\n", idx, ret); + return -EINVAL; + } + + return 0; +} -- 2.25.1
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |