[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH 15/19] xen/dt: Move bootinfo-independent helpers out of bootinfo-fdt.c
On Sat May 31, 2025 at 2:39 AM CEST, dmkhn wrote: > On Fri, May 30, 2025 at 02:02:23PM +0200, Alejandro Vallejo wrote: >> ... back into bootfdt.c >> >> These will be required by x86 later on to detect modules in the early scan of >> the FDT. They are independent of bootinfo, so it's cleaner for them to exist >> in >> a separate file. >> >> Not a functional change. >> >> Signed-off-by: Alejandro Vallejo <agarciav@xxxxxxx> >> --- >> xen/common/device-tree/Makefile | 1 + >> xen/common/device-tree/bootfdt.c | 97 ++++++++++++++++++++++++ >> xen/common/device-tree/bootinfo-fdt.c | 104 -------------------------- >> 3 files changed, 98 insertions(+), 104 deletions(-) >> create mode 100644 xen/common/device-tree/bootfdt.c >> >> diff --git a/xen/common/device-tree/Makefile >> b/xen/common/device-tree/Makefile >> index bb6d5ddec5..922c5bba9b 100644 >> --- a/xen/common/device-tree/Makefile >> +++ b/xen/common/device-tree/Makefile >> @@ -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 >> diff --git a/xen/common/device-tree/bootfdt.c >> b/xen/common/device-tree/bootfdt.c >> new file mode 100644 >> index 0000000000..5decf17faf >> --- /dev/null >> +++ b/xen/common/device-tree/bootfdt.c >> @@ -0,0 +1,97 @@ >> +/* SPDX-License-Identifier: GPL-2.0-only */ >> +#include <xen/bootfdt.h> >> +#include <xen/bug.h> >> +#include <xen/lib.h> >> +#include <xen/libfdt/libfdt.h> >> + >> +uint32_t __init device_tree_get_u32(const void *fdt, int node, >> + const char *prop_name, uint32_t 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(*(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); > > Use XENLOG_WARNING? > >> + 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; >> +} >> + >> +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"); > > I would add current and expected dt_start values to the printout. > >> + 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; >> +} >> diff --git a/xen/common/device-tree/bootinfo-fdt.c >> b/xen/common/device-tree/bootinfo-fdt.c >> index bb5f45771e..736f877616 100644 >> --- a/xen/common/device-tree/bootinfo-fdt.c >> +++ b/xen/common/device-tree/bootinfo-fdt.c >> @@ -112,39 +112,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, >> @@ -205,77 +172,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(*(uint32_t*)prop->data); >> -} >> - >> -/** >> - * device_tree_for_each_node - iterate over all device tree sub-nodes >> - * @fdt: flat device tree. >> - * @node: parent node to start the search from >> - * @func: function to call for each sub-node. >> - * @data: data to pass to @func. >> - * >> - * Any nodes nested at DEVICE_TREE_MAX_DEPTH or deeper are ignored. >> - * >> - * Returns 0 if all nodes were iterated over successfully. If @func >> - * returns a value different from 0, that value is returned immediately. >> - */ >> -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, >> -- >> 2.43.0 >> >> As I answered to Daniel, as I'd rather not introduce functional changes in code motion commits. I draw the line at trivial retyping (e.g: u32->uint32_t) Otherwise it's just very confusing to future readers. Cheers, Alejandro
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |