mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 02:30:03 +01:00
xen/dt: Extract bootinfo-independent functions to bootfdt.c
Move all functions independent of "struct bootinfo" back to bootfdt.c Not a functional change. Signed-off-by: Alejandro Vallejo <alejandro.garciavallejo@amd.com> Reviewed-by: Michal Orzel <michal.orzel@amd.com>
This commit is contained in:
1 parent
481f427d5e
commit
7fa7cb95dc
3 files changed
+101
-93
No files matched your search
@@ -1,3 +1,4 @@
|
||||
obj-y += bootfdt.init.o
|
||||
obj-y += bootinfo-fdt.init.o
|
||||
obj-y += bootinfo.init.o
|
||||
obj-y += device-tree.o
|
||||
|
||||
@@ -0,0 +1,99 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
#include <xen/bootfdt.h>
|
||||
#include <xen/bug.h>
|
||||
#include <xen/lib.h>
|
||||
#include <xen/libfdt/libfdt.h>
|
||||
#include <xen/unaligned.h>
|
||||
|
||||
void __init device_tree_get_reg(const __be32 **cell, uint32_t address_cells,
|
||||
uint32_t size_cells, paddr_t *start,
|
||||
paddr_t *size)
|
||||
{
|
||||
uint64_t dt_start, dt_size;
|
||||
|
||||
/*
|
||||
* dt_next_cell will return uint64_t whereas paddr_t may not be 64-bit.
|
||||
* Thus, there is an implicit cast from uint64_t to paddr_t.
|
||||
*/
|
||||
dt_start = dt_next_cell(address_cells, cell);
|
||||
dt_size = dt_next_cell(size_cells, cell);
|
||||
|
||||
if ( dt_start != (paddr_t)dt_start )
|
||||
{
|
||||
printk("Physical address greater than max width supported\n");
|
||||
WARN();
|
||||
}
|
||||
|
||||
if ( dt_size != (paddr_t)dt_size )
|
||||
{
|
||||
printk("Physical size greater than max width supported\n");
|
||||
WARN();
|
||||
}
|
||||
|
||||
/*
|
||||
* Xen will truncate the address/size if it is greater than the maximum
|
||||
* supported width and it will give an appropriate warning.
|
||||
*/
|
||||
*start = dt_start;
|
||||
*size = dt_size;
|
||||
}
|
||||
|
||||
u32 __init device_tree_get_u32(const void *fdt, int node,
|
||||
const char *prop_name, u32 dflt)
|
||||
{
|
||||
const struct fdt_property *prop;
|
||||
|
||||
prop = fdt_get_property(fdt, node, prop_name, NULL);
|
||||
if ( !prop || prop->len < sizeof(u32) )
|
||||
return dflt;
|
||||
|
||||
return fdt32_to_cpu(get_unaligned_t(uint32_t, prop->data));
|
||||
}
|
||||
|
||||
int __init device_tree_for_each_node(const void *fdt, int node,
|
||||
device_tree_node_func func,
|
||||
void *data)
|
||||
{
|
||||
/*
|
||||
* We only care about relative depth increments, assume depth of
|
||||
* node is 0 for simplicity.
|
||||
*/
|
||||
int depth = 0;
|
||||
const int first_node = node;
|
||||
u32 address_cells[DEVICE_TREE_MAX_DEPTH];
|
||||
u32 size_cells[DEVICE_TREE_MAX_DEPTH];
|
||||
int ret;
|
||||
|
||||
do {
|
||||
const char *name = fdt_get_name(fdt, node, NULL);
|
||||
u32 as, ss;
|
||||
|
||||
if ( depth >= DEVICE_TREE_MAX_DEPTH )
|
||||
{
|
||||
printk("Warning: device tree node `%s' is nested too deep\n",
|
||||
name);
|
||||
continue;
|
||||
}
|
||||
|
||||
as = depth > 0 ? address_cells[depth-1] : DT_ROOT_NODE_ADDR_CELLS_DEFAULT;
|
||||
ss = depth > 0 ? size_cells[depth-1] : DT_ROOT_NODE_SIZE_CELLS_DEFAULT;
|
||||
|
||||
address_cells[depth] = device_tree_get_u32(fdt, node,
|
||||
"#address-cells", as);
|
||||
size_cells[depth] = device_tree_get_u32(fdt, node,
|
||||
"#size-cells", ss);
|
||||
|
||||
/* skip the first node */
|
||||
if ( node != first_node )
|
||||
{
|
||||
ret = func(fdt, node, name, depth, as, ss, data);
|
||||
if ( ret != 0 )
|
||||
return ret;
|
||||
}
|
||||
|
||||
node = fdt_next_node(fdt, node, &depth);
|
||||
} while ( node >= 0 && depth > 0 );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* Early Device Tree
|
||||
* Early Device Tree with bootinfo hooks
|
||||
*
|
||||
* Copyright (C) 2012-2014 Citrix Systems, Inc.
|
||||
*/
|
||||
@@ -110,39 +110,6 @@ static bool __init device_tree_is_memory_node(const void *fdt, int node,
|
||||
return true;
|
||||
}
|
||||
|
||||
void __init device_tree_get_reg(const __be32 **cell, uint32_t address_cells,
|
||||
uint32_t size_cells, paddr_t *start,
|
||||
paddr_t *size)
|
||||
{
|
||||
uint64_t dt_start, dt_size;
|
||||
|
||||
/*
|
||||
* dt_next_cell will return uint64_t whereas paddr_t may not be 64-bit.
|
||||
* Thus, there is an implicit cast from uint64_t to paddr_t.
|
||||
*/
|
||||
dt_start = dt_next_cell(address_cells, cell);
|
||||
dt_size = dt_next_cell(size_cells, cell);
|
||||
|
||||
if ( dt_start != (paddr_t)dt_start )
|
||||
{
|
||||
printk("Physical address greater than max width supported\n");
|
||||
WARN();
|
||||
}
|
||||
|
||||
if ( dt_size != (paddr_t)dt_size )
|
||||
{
|
||||
printk("Physical size greater than max width supported\n");
|
||||
WARN();
|
||||
}
|
||||
|
||||
/*
|
||||
* Xen will truncate the address/size if it is greater than the maximum
|
||||
* supported width and it will give an appropriate warning.
|
||||
*/
|
||||
*start = dt_start;
|
||||
*size = dt_size;
|
||||
}
|
||||
|
||||
static int __init device_tree_get_meminfo(const void *fdt, int node,
|
||||
const char *prop_name,
|
||||
u32 address_cells, u32 size_cells,
|
||||
@@ -203,65 +170,6 @@ static int __init device_tree_get_meminfo(const void *fdt, int node,
|
||||
return 0;
|
||||
}
|
||||
|
||||
u32 __init device_tree_get_u32(const void *fdt, int node,
|
||||
const char *prop_name, u32 dflt)
|
||||
{
|
||||
const struct fdt_property *prop;
|
||||
|
||||
prop = fdt_get_property(fdt, node, prop_name, NULL);
|
||||
if ( !prop || prop->len < sizeof(u32) )
|
||||
return dflt;
|
||||
|
||||
return fdt32_to_cpu(get_unaligned_t(uint32_t, prop->data));
|
||||
}
|
||||
|
||||
int __init device_tree_for_each_node(const void *fdt, int node,
|
||||
device_tree_node_func func,
|
||||
void *data)
|
||||
{
|
||||
/*
|
||||
* We only care about relative depth increments, assume depth of
|
||||
* node is 0 for simplicity.
|
||||
*/
|
||||
int depth = 0;
|
||||
const int first_node = node;
|
||||
u32 address_cells[DEVICE_TREE_MAX_DEPTH];
|
||||
u32 size_cells[DEVICE_TREE_MAX_DEPTH];
|
||||
int ret;
|
||||
|
||||
do {
|
||||
const char *name = fdt_get_name(fdt, node, NULL);
|
||||
u32 as, ss;
|
||||
|
||||
if ( depth >= DEVICE_TREE_MAX_DEPTH )
|
||||
{
|
||||
printk("Warning: device tree node `%s' is nested too deep\n",
|
||||
name);
|
||||
continue;
|
||||
}
|
||||
|
||||
as = depth > 0 ? address_cells[depth-1] : DT_ROOT_NODE_ADDR_CELLS_DEFAULT;
|
||||
ss = depth > 0 ? size_cells[depth-1] : DT_ROOT_NODE_SIZE_CELLS_DEFAULT;
|
||||
|
||||
address_cells[depth] = device_tree_get_u32(fdt, node,
|
||||
"#address-cells", as);
|
||||
size_cells[depth] = device_tree_get_u32(fdt, node,
|
||||
"#size-cells", ss);
|
||||
|
||||
/* skip the first node */
|
||||
if ( node != first_node )
|
||||
{
|
||||
ret = func(fdt, node, name, depth, as, ss, data);
|
||||
if ( ret != 0 )
|
||||
return ret;
|
||||
}
|
||||
|
||||
node = fdt_next_node(fdt, node, &depth);
|
||||
} while ( node >= 0 && depth > 0 );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __init process_memory_node(const void *fdt, int node,
|
||||
const char *name, int depth,
|
||||
u32 address_cells, u32 size_cells,
|
||||
|
||||