From 56844a22b76c719e600047e23b80465a44d76abd Mon Sep 17 00:00:00 2001 From: Heiko Schocher Date: Thu, 11 Sep 2008 08:11:23 +0200 Subject: powerpc: Fix bootm to boot up again with a Ramdisk Commit 2a1a2cb6 didnt remove the dummy mem reservation in fdt_chosen, and this stopped Linux from booting with a Ramdisk. This patch fixes this, by deleting the useless dummy mem reservation. When booting with a Ramdisk, a fix offset FDT_RAMDISK_OVERHEAD is now added to of_size, so we dont need anymore a dummy mem reservation. I measured the value of FDT_RAMDISK_OVERHEAD on a MPC8270 based system (=0x44 bytes) and rounded it up to 0x80). Signed-off-by: Heiko Schocher Acked-by: Kumar Gala --- include/fdt_support.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'include/fdt_support.h') diff --git a/include/fdt_support.h b/include/fdt_support.h index 424c3c6b7..ceaadc2be 100644 --- a/include/fdt_support.h +++ b/include/fdt_support.h @@ -28,7 +28,7 @@ #include -int fdt_chosen(void *fdt, ulong initrd_start, ulong initrd_end, int force); +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, const void *val, int len, int create); -- cgit v1.2.3-70-g09d2 From 3bed2aaf2d50fd13273c14d17d4fd40ef42e0d0f Mon Sep 17 00:00:00 2001 From: Kumar Gala Date: Thu, 23 Oct 2008 00:05:47 -0500 Subject: 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 Signed-off-by: Andrew Fleming-AFLEMING Acked-by: Gerald Van Baren --- common/fdt_support.c | 27 +++++++++++++++++++++++++++ include/fdt_support.h | 2 ++ 2 files changed, 29 insertions(+) (limited to 'include/fdt_support.h') diff --git a/common/fdt_support.c b/common/fdt_support.c index 8ceeb0faa..f4307774d 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 ceaadc2be..816c9d08b 100644 --- a/include/fdt_support.h +++ b/include/fdt_support.h @@ -28,6 +28,8 @@ #include +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, -- cgit v1.2.3-70-g09d2 From 8ab451c46b846f2bbd7122b29ffdd9a4a04da228 Mon Sep 17 00:00:00 2001 From: Kumar Gala Date: Wed, 22 Oct 2008 23:33:56 -0500 Subject: fdt: Added helper to set PCI dma-ranges property 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 Signed-off-by: Andrew Fleming-AFLEMING --- common/fdt_support.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++ include/fdt_support.h | 5 ++++ 2 files changed, 74 insertions(+) (limited to 'include/fdt_support.h') diff --git a/common/fdt_support.c b/common/fdt_support.c index f4307774d..d483d66f1 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 816c9d08b..6062df976 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 +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); -- cgit v1.2.3-70-g09d2