[U-Boot] [PATCH v2 04/10] fdt: Add fdt_getprop_u32_default helpers

Add helper functions to return find a node and return it's property or a default value.
Signed-off-by: Kumar Gala galak@kernel.crashing.org --- common/fdt_support.c | 27 +++++++++++++++++++++++++++ include/fdt_support.h | 2 ++ 2 files changed, 29 insertions(+), 0 deletions(-)
diff --git a/common/fdt_support.c b/common/fdt_support.c index 8ceeb0f..f430777 100644 --- a/common/fdt_support.c +++ b/common/fdt_support.c @@ -35,6 +35,33 @@ */ DECLARE_GLOBAL_DATA_PTR;
+/** + * fdt_getprop_u32_default - Find a node and return it's property or a default + * + * @fdt: ptr to device tree + * @path: path of node + * @prop: property name + * @dflt: default value if the property isn't found + * + * Convenience function to find a node and return it's property or a + * default value if it doesn't exist. + */ +u32 fdt_getprop_u32_default(void *fdt, const char *path, const char *prop, + const u32 dflt) +{ + const u32 *val; + int off; + + off = fdt_path_offset(fdt, path); + if (off < 0) + return dflt; + + val = fdt_getprop(fdt, off, prop, NULL); + if (val) + return *val; + else + return dflt; +}
/** * fdt_find_and_setprop: Find a node and set it's property diff --git a/include/fdt_support.h b/include/fdt_support.h index ceaadc2..816c9d0 100644 --- a/include/fdt_support.h +++ b/include/fdt_support.h @@ -28,6 +28,8 @@
#include <fdt.h>
+u32 fdt_getprop_u32_default(void *fdt, const char *path, const char *prop, + const u32 dflt); int fdt_chosen(void *fdt, int force); int fdt_initrd(void *fdt, ulong initrd_start, ulong initrd_end, int force); void do_fixup_by_path(void *fdt, const char *path, const char *prop,

Added fdt_pci_dma_ranges() that parses the pci_region info from the struct pci_controller and populates the dma-ranges based on it.
The max # of windws/dma-ranges we support is 3 since on embedded PowerPC based systems this is the max number of windows.
Signed-off-by: Kumar Gala galak@kernel.crashing.org ---
move to using fdt_getprop_u32_default
- k
common/fdt_support.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++++ include/fdt_support.h | 5 +++ 2 files changed, 74 insertions(+), 0 deletions(-)
diff --git a/common/fdt_support.c b/common/fdt_support.c index f430777..d483d66 100644 --- a/common/fdt_support.c +++ b/common/fdt_support.c @@ -620,3 +620,72 @@ int fdt_resize(void *blob)
return actualsize; } + +#ifdef CONFIG_PCI +#define CONFIG_SYS_PCI_NR_INBOUND_WIN 3 + +#define FDT_PCI_PREFETCH (0x40000000) +#define FDT_PCI_MEM32 (0x02000000) +#define FDT_PCI_IO (0x01000000) +#define FDT_PCI_MEM64 (0x03000000) + +int fdt_pci_dma_ranges(void *blob, int phb_off, struct pci_controller *hose) { + + int addrcell, sizecell, len, r; + u32 *dma_range; + /* sized based on pci addr cells, size-cells, & address-cells */ + u32 dma_ranges[(3 + 2 + 2) * CONFIG_SYS_PCI_NR_INBOUND_WIN]; + + addrcell = fdt_getprop_u32_default(blob, "/", "#address-cells", 1); + sizecell = fdt_getprop_u32_default(blob, "/", "#size-cells", 1); + + dma_range = &dma_ranges[0]; + for (r = 0; r < hose->region_count; r++) { + u64 bus_start, phys_start, size; + + /* skip if !PCI_REGION_MEMORY */ + if (!(hose->regions[r].flags & PCI_REGION_MEMORY)) + continue; + + bus_start = (u64)hose->regions[r].bus_start; + phys_start = (u64)hose->regions[r].phys_start; + size = (u64)hose->regions[r].size; + + dma_range[0] = 0; + if (size > 0x100000000ull) + dma_range[0] |= FDT_PCI_MEM64; + else + dma_range[0] |= FDT_PCI_MEM32; + if (hose->regions[r].flags & PCI_REGION_PREFETCH) + dma_range[0] |= FDT_PCI_PREFETCH; +#ifdef CONFIG_SYS_PCI_64BIT + dma_range[1] = bus_start >> 32; +#else + dma_range[1] = 0; +#endif + dma_range[2] = bus_start & 0xffffffff; + + if (addrcell == 2) { + dma_range[3] = phys_start >> 32; + dma_range[4] = phys_start & 0xffffffff; + } else { + dma_range[3] = phys_start & 0xffffffff; + } + + if (sizecell == 2) { + dma_range[3 + addrcell + 0] = size >> 32; + dma_range[3 + addrcell + 1] = size & 0xffffffff; + } else { + dma_range[3 + addrcell + 0] = size & 0xffffffff; + } + + dma_range += (3 + addrcell + sizecell); + } + + len = dma_range - &dma_ranges[0]; + if (len) + fdt_setprop(blob, phb_off, "dma-ranges", &dma_ranges[0], len*4); + + return 0; +} +#endif diff --git a/include/fdt_support.h b/include/fdt_support.h index 816c9d0..6062df9 100644 --- a/include/fdt_support.h +++ b/include/fdt_support.h @@ -65,6 +65,11 @@ void fdt_fixup_crypto_node(void *blob, int sec_rev); static inline void fdt_fixup_crypto_node(void *blob, int sec_rev) {} #endif
+#ifdef CONFIG_PCI +#include <pci.h> +int fdt_pci_dma_ranges(void *blob, int phb_off, struct pci_controller *hose); +#endif + #ifdef CONFIG_OF_BOARD_SETUP void ft_board_setup(void *blob, bd_t *bd); void ft_cpu_setup(void *blob, bd_t *bd);

Kumar Gala wrote:
Added fdt_pci_dma_ranges() that parses the pci_region info from the struct pci_controller and populates the dma-ranges based on it.
The max # of windws/dma-ranges we support is 3 since on embedded PowerPC based systems this is the max number of windows.
Signed-off-by: Kumar Gala galak@kernel.crashing.org
move to using fdt_getprop_u32_default
- k
common/fdt_support.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++++ include/fdt_support.h | 5 +++ 2 files changed, 74 insertions(+), 0 deletions(-)
diff --git a/common/fdt_support.c b/common/fdt_support.c index f430777..d483d66 100644 --- a/common/fdt_support.c +++ b/common/fdt_support.c
[snip]
diff --git a/include/fdt_support.h b/include/fdt_support.h index 816c9d0..6062df9 100644 --- a/include/fdt_support.h +++ b/include/fdt_support.h
[snip]
I'm not really authoritative on the PCI changes, but it looks good to me so I'm OK with adding this to fdt_support.[ch].
Acked-by: Gerald Van Baren vanbaren@cideas.com
Thanks, gvb

Kumar Gala wrote:
Add helper functions to return find a node and return it's property or a default value.
Signed-off-by: Kumar Gala galak@kernel.crashing.org
common/fdt_support.c | 27 +++++++++++++++++++++++++++ include/fdt_support.h | 2 ++ 2 files changed, 29 insertions(+), 0 deletions(-)
diff --git a/common/fdt_support.c b/common/fdt_support.c index 8ceeb0f..f430777 100644 --- a/common/fdt_support.c +++ b/common/fdt_support.c @@ -35,6 +35,33 @@ */ DECLARE_GLOBAL_DATA_PTR;
+/**
- fdt_getprop_u32_default - Find a node and return it's property or a default
- @fdt: ptr to device tree
- @path: path of node
- @prop: property name
- @dflt: default value if the property isn't found
- Convenience function to find a node and return it's property or a
- default value if it doesn't exist.
- */
+u32 fdt_getprop_u32_default(void *fdt, const char *path, const char *prop,
const u32 dflt)
+{
- const u32 *val;
- int off;
- off = fdt_path_offset(fdt, path);
- if (off < 0)
return dflt;
- val = fdt_getprop(fdt, off, prop, NULL);
- if (val)
return *val;
- else
return dflt;
+}
/**
- fdt_find_and_setprop: Find a node and set it's property
diff --git a/include/fdt_support.h b/include/fdt_support.h index ceaadc2..816c9d0 100644 --- a/include/fdt_support.h +++ b/include/fdt_support.h @@ -28,6 +28,8 @@
#include <fdt.h>
+u32 fdt_getprop_u32_default(void *fdt, const char *path, const char *prop,
const u32 dflt);
int fdt_chosen(void *fdt, int force); int fdt_initrd(void *fdt, ulong initrd_start, ulong initrd_end, int force); void do_fixup_by_path(void *fdt, const char *path, const char *prop,
Acked-by: Gerald Van Baren vanbaren@cideas.com
Thanks! gvb
participants (2)
-
Jerry Van Baren
-
Kumar Gala