X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;ds=sidebyside;f=common%2Ffdt_support.c;h=1f0d8f5fe9a3348addd99255b4538dd3830fd424;hb=dd88ab325cfcc7f803afd40600571b3f9c79319c;hp=593f16c1620138b306ea76b1e15c7612061d0b2b;hpb=07e12784966c1d61b07861e6971fb8750a2ecc0c;p=u-boot diff --git a/common/fdt_support.c b/common/fdt_support.c index 593f16c162..1f0d8f5fe9 100644 --- a/common/fdt_support.c +++ b/common/fdt_support.c @@ -4,23 +4,7 @@ * * Copyright 2010-2011 Freescale Semiconductor, Inc. * - * See file CREDITS for list of people who contributed to this - * project. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, - * MA 02111-1307 USA + * SPDX-License-Identifier: GPL-2.0+ */ #include @@ -28,7 +12,6 @@ #include #include #include -#include #include #include #include @@ -52,7 +35,7 @@ DECLARE_GLOBAL_DATA_PTR; u32 fdt_getprop_u32_default(const void *fdt, const char *path, const char *prop, const u32 dflt) { - const u32 *val; + const fdt32_t *val; int off; off = fdt_path_offset(fdt, path); @@ -86,7 +69,7 @@ int fdt_find_and_setprop(void *fdt, const char *node, const char *prop, if (nodeoff < 0) return nodeoff; - if ((!create) && (fdt_get_property(fdt, nodeoff, prop, 0) == NULL)) + if ((!create) && (fdt_get_property(fdt, nodeoff, prop, NULL) == NULL)) return 0; /* create flag not set; so exit quietly */ return fdt_setprop(fdt, nodeoff, prop, val, len); @@ -94,7 +77,7 @@ int fdt_find_and_setprop(void *fdt, const char *node, const char *prop, #ifdef CONFIG_OF_STDOUT_VIA_ALIAS -#ifdef CONFIG_SERIAL_MULTI +#ifdef CONFIG_CONS_INDEX static void fdt_fill_multisername(char *sername, size_t maxlen) { const char *outname = stdio_devices[stdout]->name; @@ -106,9 +89,7 @@ static void fdt_fill_multisername(char *sername, size_t maxlen) if (strcmp(outname + 1, "serial") > 0) strncpy(sername, outname + 1, maxlen); } -#else -static inline void fdt_fill_multisername(char *sername, size_t maxlen) {} -#endif /* CONFIG_SERIAL_MULTI */ +#endif static int fdt_fixup_stdout(void *fdt, int chosenoff) { @@ -152,7 +133,7 @@ int fdt_initrd(void *fdt, ulong initrd_start, ulong initrd_end, int force) { int nodeoffset; int err, j, total; - u32 tmp; + fdt32_t tmp; const char *path; uint64_t addr, size; @@ -191,7 +172,7 @@ int fdt_initrd(void *fdt, ulong initrd_start, ulong initrd_end, int force) path = fdt_getprop(fdt, nodeoffset, "linux,initrd-start", NULL); if ((path == NULL) || force) { - tmp = __cpu_to_be32(initrd_start); + tmp = cpu_to_fdt32(initrd_start); err = fdt_setprop(fdt, nodeoffset, "linux,initrd-start", &tmp, sizeof(tmp)); if (err < 0) { @@ -200,7 +181,7 @@ int fdt_initrd(void *fdt, ulong initrd_start, ulong initrd_end, int force) fdt_strerror(err)); return err; } - tmp = __cpu_to_be32(initrd_end); + tmp = cpu_to_fdt32(initrd_end); err = fdt_setprop(fdt, nodeoffset, "linux,initrd-end", &tmp, sizeof(tmp)); if (err < 0) { @@ -303,8 +284,8 @@ void do_fixup_by_path(void *fdt, const char *path, const char *prop, void do_fixup_by_path_u32(void *fdt, const char *path, const char *prop, u32 val, int create) { - val = cpu_to_fdt32(val); - do_fixup_by_path(fdt, path, prop, &val, sizeof(val), create); + fdt32_t tmp = cpu_to_fdt32(val); + do_fixup_by_path(fdt, path, prop, &tmp, sizeof(tmp), create); } void do_fixup_by_prop(void *fdt, @@ -322,7 +303,7 @@ void do_fixup_by_prop(void *fdt, #endif off = fdt_node_offset_by_prop_value(fdt, -1, pname, pval, plen); while (off != -FDT_ERR_NOTFOUND) { - if (create || (fdt_get_property(fdt, off, prop, 0) != NULL)) + if (create || (fdt_get_property(fdt, off, prop, NULL) != NULL)) fdt_setprop(fdt, off, prop, val, len); off = fdt_node_offset_by_prop_value(fdt, off, pname, pval, plen); } @@ -332,8 +313,8 @@ void do_fixup_by_prop_u32(void *fdt, const char *pname, const void *pval, int plen, const char *prop, u32 val, int create) { - val = cpu_to_fdt32(val); - do_fixup_by_prop(fdt, pname, pval, plen, prop, &val, 4, create); + fdt32_t tmp = cpu_to_fdt32(val); + do_fixup_by_prop(fdt, pname, pval, plen, prop, &tmp, 4, create); } void do_fixup_by_compat(void *fdt, const char *compat, @@ -349,7 +330,7 @@ void do_fixup_by_compat(void *fdt, const char *compat, #endif off = fdt_node_offset_by_compatible(fdt, -1, compat); while (off != -FDT_ERR_NOTFOUND) { - if (create || (fdt_get_property(fdt, off, prop, 0) != NULL)) + if (create || (fdt_get_property(fdt, off, prop, NULL) != NULL)) fdt_setprop(fdt, off, prop, val, len); off = fdt_node_offset_by_compatible(fdt, off, compat); } @@ -358,8 +339,8 @@ void do_fixup_by_compat(void *fdt, const char *compat, void do_fixup_by_compat_u32(void *fdt, const char *compat, const char *prop, u32 val, int create) { - val = cpu_to_fdt32(val); - do_fixup_by_compat(fdt, compat, prop, &val, 4, create); + fdt32_t tmp = cpu_to_fdt32(val); + do_fixup_by_compat(fdt, compat, prop, &tmp, 4, create); } /* @@ -369,7 +350,7 @@ void do_fixup_by_compat_u32(void *fdt, const char *compat, */ static int get_cells_len(void *blob, char *nr_cells_name) { - const u32 *cell; + const fdt32_t *cell; cell = fdt_getprop(blob, 0, nr_cells_name, NULL); if (cell && fdt32_to_cpu(*cell) == 2) @@ -390,13 +371,25 @@ static void write_cell(u8 *addr, u64 val, int size) } } +#ifdef CONFIG_NR_DRAM_BANKS +#define MEMORY_BANKS_MAX CONFIG_NR_DRAM_BANKS +#else +#define MEMORY_BANKS_MAX 4 +#endif int fdt_fixup_memory_banks(void *blob, u64 start[], u64 size[], int banks) { int err, nodeoffset; int addr_cell_len, size_cell_len, len; - u8 tmp[banks * 16]; /* Up to 64-bit address + 64-bit size */ + u8 tmp[MEMORY_BANKS_MAX * 16]; /* Up to 64-bit address + 64-bit size */ int bank; + if (banks > MEMORY_BANKS_MAX) { + printf("%s: num banks %d exceeds hardcoded limit %d." + " Recompile with higher MEMORY_BANKS_MAX?\n", + __FUNCTION__, banks, MEMORY_BANKS_MAX); + return -1; + } + err = fdt_check_header(blob); if (err < 0) { printf("%s: %s\n", __FUNCTION__, fdt_strerror(err)); @@ -449,7 +442,7 @@ void fdt_fixup_ethernet(void *fdt) { int node, i, j; char enet[16], *tmp, *end; - char mac[16] = "ethaddr"; + char mac[16]; const char *path; unsigned char mac_addr[6]; @@ -458,6 +451,7 @@ void fdt_fixup_ethernet(void *fdt) return; i = 0; + strcpy(mac, "ethaddr"); while ((tmp = getenv(mac)) != NULL) { sprintf(enet, "ethernet%d", i); path = fdt_getprop(fdt, node, enet, NULL); @@ -772,11 +766,11 @@ int fdt_node_set_part_info(void *blob, int parent_offset, part = list_entry(pentry, struct part_info, link); - debug("%2d: %-20s0x%08x\t0x%08x\t%d\n", + debug("%2d: %-20s0x%08llx\t0x%08llx\t%d\n", part_num, part->name, part->size, part->offset, part->mask_flags); - sprintf(buf, "partition@%x", part->offset); + sprintf(buf, "partition@%llx", part->offset); add_sub: ret = fdt_add_subnode(blob, parent_offset, buf); if (ret == -FDT_ERR_NOSPACE) { @@ -905,11 +899,11 @@ void fdt_del_node_and_alias(void *blob, const char *alias) } /* Helper to read a big number; size is in cells (not bytes) */ -static inline u64 of_read_number(const __be32 *cell, int size) +static inline u64 of_read_number(const fdt32_t *cell, int size) { u64 r = 0; while (size--) - r = (r << 32) | be32_to_cpu(*(cell++)); + r = (r << 32) | fdt32_to_cpu(*(cell++)); return r; } @@ -923,7 +917,7 @@ static inline u64 of_read_number(const __be32 *cell, int size) /* Debug utility */ #ifdef DEBUG -static void of_dump_addr(const char *s, const u32 *addr, int na) +static void of_dump_addr(const char *s, const fdt32_t *addr, int na) { printf("%s", s); while(na--) @@ -931,7 +925,7 @@ static void of_dump_addr(const char *s, const u32 *addr, int na) printf("\n"); } #else -static void of_dump_addr(const char *s, const u32 *addr, int na) { } +static void of_dump_addr(const char *s, const fdt32_t *addr, int na) { } #endif /* Callbacks for bus specific translators */ @@ -940,21 +934,21 @@ struct of_bus { const char *addresses; void (*count_cells)(void *blob, int parentoffset, int *addrc, int *sizec); - u64 (*map)(u32 *addr, const u32 *range, + u64 (*map)(fdt32_t *addr, const fdt32_t *range, int na, int ns, int pna); - int (*translate)(u32 *addr, u64 offset, int na); + int (*translate)(fdt32_t *addr, u64 offset, int na); }; /* Default translator (generic bus) */ static void of_bus_default_count_cells(void *blob, int parentoffset, int *addrc, int *sizec) { - const u32 *prop; + const fdt32_t *prop; if (addrc) { prop = fdt_getprop(blob, parentoffset, "#address-cells", NULL); if (prop) - *addrc = be32_to_cpup((u32 *)prop); + *addrc = be32_to_cpup(prop); else *addrc = 2; } @@ -962,13 +956,13 @@ static void of_bus_default_count_cells(void *blob, int parentoffset, if (sizec) { prop = fdt_getprop(blob, parentoffset, "#size-cells", NULL); if (prop) - *sizec = be32_to_cpup((u32 *)prop); + *sizec = be32_to_cpup(prop); else *sizec = 1; } } -static u64 of_bus_default_map(u32 *addr, const u32 *range, +static u64 of_bus_default_map(fdt32_t *addr, const fdt32_t *range, int na, int ns, int pna) { u64 cp, s, da; @@ -985,14 +979,14 @@ static u64 of_bus_default_map(u32 *addr, const u32 *range, return da - cp; } -static int of_bus_default_translate(u32 *addr, u64 offset, int na) +static int of_bus_default_translate(fdt32_t *addr, u64 offset, int na) { u64 a = of_read_number(addr, na); memset(addr, 0, na * 4); a += offset; if (na > 1) - addr[na - 2] = a >> 32; - addr[na - 1] = a & 0xffffffffu; + addr[na - 2] = cpu_to_fdt32(a >> 32); + addr[na - 1] = cpu_to_fdt32(a & 0xffffffffu); return 0; } @@ -1010,10 +1004,10 @@ static struct of_bus of_busses[] = { }; static int of_translate_one(void * blob, int parent, struct of_bus *bus, - struct of_bus *pbus, u32 *addr, + struct of_bus *pbus, fdt32_t *addr, int na, int ns, int pna, const char *rprop) { - const u32 *ranges; + const fdt32_t *ranges; int rlen; int rone; u64 offset = OF_BAD_ADDR; @@ -1030,7 +1024,7 @@ static int of_translate_one(void * blob, int parent, struct of_bus *bus, * to translate addresses that aren't supposed to be translated in * the first place. --BenH. */ - ranges = (u32 *)fdt_getprop(blob, parent, rprop, &rlen); + ranges = fdt_getprop(blob, parent, rprop, &rlen); if (ranges == NULL || rlen == 0) { offset = of_read_number(addr, na); memset(addr, 0, pna * 4); @@ -1072,12 +1066,12 @@ static int of_translate_one(void * blob, int parent, struct of_bus *bus, * that can be mapped to a cpu physical address). This is not really specified * that way, but this is traditionally the way IBM at least do things */ -u64 __of_translate_address(void *blob, int node_offset, const u32 *in_addr, - const char *rprop) +static u64 __of_translate_address(void *blob, int node_offset, const fdt32_t *in_addr, + const char *rprop) { int parent; struct of_bus *bus, *pbus; - u32 addr[OF_MAX_ADDR_CELLS]; + fdt32_t addr[OF_MAX_ADDR_CELLS]; int na, ns, pna, pns; u64 result = OF_BAD_ADDR; @@ -1145,7 +1139,7 @@ u64 __of_translate_address(void *blob, int node_offset, const u32 *in_addr, return result; } -u64 fdt_translate_address(void *blob, int node_offset, const u32 *in_addr) +u64 fdt_translate_address(void *blob, int node_offset, const fdt32_t *in_addr) { return __of_translate_address(blob, node_offset, in_addr, "ranges"); } @@ -1164,7 +1158,7 @@ int fdt_node_offset_by_compat_reg(void *blob, const char *compat, { int len, off = fdt_node_offset_by_compatible(blob, -1, compat); while (off != -FDT_ERR_NOTFOUND) { - u32 *reg = (u32 *)fdt_getprop(blob, off, "reg", &len); + const fdt32_t *reg = fdt_getprop(blob, off, "reg", &len); if (reg) { if (compat_off == fdt_translate_address(blob, off, reg)) return off; @@ -1317,7 +1311,7 @@ int fdt_set_status_by_alias(void *fdt, const char* alias, return fdt_set_node_status(fdt, offset, status, error_code); } -#if defined(CONFIG_VIDEO) +#if defined(CONFIG_VIDEO) || defined(CONFIG_LCD) int fdt_add_edid(void *blob, const char *compat, unsigned char *edid_buf) { int noff; @@ -1358,7 +1352,7 @@ err_size: int fdt_verify_alias_address(void *fdt, int anode, const char *alias, u64 addr) { const char *path; - const u32 *reg; + const fdt32_t *reg; int node, len; u64 dt_addr; @@ -1400,11 +1394,11 @@ u64 fdt_get_base_address(void *fdt, int node) { int size; u32 naddr; - const u32 *prop; + const fdt32_t *prop; prop = fdt_getprop(fdt, node, "#address-cells", &size); if (prop && size == 4) - naddr = *prop; + naddr = be32_to_cpup(prop); else naddr = 2;