libfdt: Revert 6dcb8ba4 from upstream libfdt
authorTom Rini <trini@konsulko.com>
Mon, 27 Jan 2020 17:10:31 +0000 (12:10 -0500)
committerTom Rini <trini@konsulko.com>
Thu, 30 Jan 2020 18:30:35 +0000 (13:30 -0500)
In upstream libfdt, 6dcb8ba4 "libfdt: Add helpers for accessing
unaligned words" introduced changes to support unaligned reads for ARM
platforms and 11738cf01f15 "libfdt: Don't use memcpy to handle unaligned
reads on ARM" improved the performance of these helpers.

In practice however, this only occurs when the user has forced the
device tree to be placed in memory in a non-aligned way, which in turn
violates both our rules and the Linux Kernel rules for how things must
reside in memory to function.

This "in practice" part is important as handling these other cases adds
visible (1 second or more) delay to boot in what would be considered the
fast path of the code.

Cc: Patrice CHOTARD <patrice.chotard@st.com>
Cc: Patrick DELAUNAY <patrick.delaunay@st.com>
Link: https://www.spinics.net/lists/devicetree-compiler/msg02972.html
Signed-off-by: Tom Rini <trini@konsulko.com>
Tested-by: Patrice Chotard <patrice.chotard@st.com>
lib/libfdt/fdt_ro.c
scripts/dtc/libfdt/fdt_ro.c
scripts/dtc/libfdt/libfdt.h

index 560041b603e1a7a1928a5816bf76dc91bed38122..be03aea9eb006f4bf9d3f908003bd30ef1ca9363 100644 (file)
@@ -183,8 +183,8 @@ int fdt_get_mem_rsv(const void *fdt, int n, uint64_t *address, uint64_t *size)
        if (fdt_chk_extra() && !re)
                return -FDT_ERR_BADOFFSET;
 
-       *address = fdt64_ld(&re->address);
-       *size = fdt64_ld(&re->size);
+       *address = fdt64_to_cpu(re->address);
+       *size = fdt64_to_cpu(re->size);
        return 0;
 }
 
@@ -194,7 +194,7 @@ int fdt_num_mem_rsv(const void *fdt)
        const struct fdt_reserve_entry *re;
 
        for (i = 0; (re = fdt_mem_rsv(fdt, i)) != NULL; i++) {
-               if (fdt64_ld(&re->size) == 0)
+               if (fdt64_to_cpu(re->size) == 0)
                        return i;
        }
        return -FDT_ERR_TRUNCATED;
@@ -372,7 +372,7 @@ static const struct fdt_property *fdt_get_property_by_offset_(const void *fdt,
        prop = fdt_offset_ptr_(fdt, offset);
 
        if (lenp)
-               *lenp = fdt32_ld(&prop->len);
+               *lenp = fdt32_to_cpu(prop->len);
 
        return prop;
 }
@@ -410,7 +410,7 @@ static const struct fdt_property *fdt_get_property_namelen_(const void *fdt,
                        offset = -FDT_ERR_INTERNAL;
                        break;
                }
-               if (fdt_string_eq_(fdt, fdt32_ld(&prop->nameoff),
+               if (fdt_string_eq_(fdt, fdt32_to_cpu(prop->nameoff),
                                   name, namelen)) {
                        if (poffset)
                                *poffset = offset;
@@ -463,7 +463,7 @@ const void *fdt_getprop_namelen(const void *fdt, int nodeoffset,
 
        /* Handle realignment */
        if (fdt_chk_version() && fdt_version(fdt) < 0x10 &&
-           (poffset + sizeof(*prop)) % 8 && fdt32_ld(&prop->len) >= 8)
+           (poffset + sizeof(*prop)) % 8 && fdt32_to_cpu(prop->len) >= 8)
                return prop->data + 4;
        return prop->data;
 }
@@ -481,7 +481,7 @@ const void *fdt_getprop_by_offset(const void *fdt, int offset,
                int namelen;
 
                if (fdt_chk_extra()) {
-                       name = fdt_get_string(fdt, fdt32_ld(&prop->nameoff),
+                       name = fdt_get_string(fdt, fdt32_to_cpu(prop->nameoff),
                                              &namelen);
                        if (!name) {
                                if (lenp)
@@ -490,13 +490,13 @@ const void *fdt_getprop_by_offset(const void *fdt, int offset,
                        }
                        *namep = name;
                } else {
-                       *namep = fdt_string(fdt, fdt32_ld(&prop->nameoff));
+                       *namep = fdt_string(fdt, fdt32_to_cpu(prop->nameoff));
                }
        }
 
        /* Handle realignment */
        if (fdt_chk_version() && fdt_version(fdt) < 0x10 &&
-           (offset + sizeof(*prop)) % 8 && fdt32_ld(&prop->len) >= 8)
+           (offset + sizeof(*prop)) % 8 && fdt32_to_cpu(prop->len) >= 8)
                return prop->data + 4;
        return prop->data;
 }
@@ -521,7 +521,7 @@ uint32_t fdt_get_phandle(const void *fdt, int nodeoffset)
                        return 0;
        }
 
-       return fdt32_ld(php);
+       return fdt32_to_cpu(*php);
 }
 
 const char *fdt_get_alias_namelen(const void *fdt,
index e398815485d6d9a467c86f116575e7a348c17863..d9d52e0d56e6c22dc926584e28513623cabf0fc1 100644 (file)
@@ -179,8 +179,8 @@ int fdt_get_mem_rsv(const void *fdt, int n, uint64_t *address, uint64_t *size)
        if (fdt_chk_extra() && !re)
                return -FDT_ERR_BADOFFSET;
 
-       *address = fdt64_ld(&re->address);
-       *size = fdt64_ld(&re->size);
+       *address = fdt64_to_cpu(re->address);
+       *size = fdt64_to_cpu(re->size);
        return 0;
 }
 
@@ -190,7 +190,7 @@ int fdt_num_mem_rsv(const void *fdt)
        const struct fdt_reserve_entry *re;
 
        for (i = 0; (re = fdt_mem_rsv(fdt, i)) != NULL; i++) {
-               if (fdt64_ld(&re->size) == 0)
+               if (fdt64_to_cpu(re->size) == 0)
                        return i;
        }
        return -FDT_ERR_TRUNCATED;
@@ -368,7 +368,7 @@ static const struct fdt_property *fdt_get_property_by_offset_(const void *fdt,
        prop = fdt_offset_ptr_(fdt, offset);
 
        if (lenp)
-               *lenp = fdt32_ld(&prop->len);
+               *lenp = fdt32_to_cpu(prop->len);
 
        return prop;
 }
@@ -406,7 +406,7 @@ static const struct fdt_property *fdt_get_property_namelen_(const void *fdt,
                        offset = -FDT_ERR_INTERNAL;
                        break;
                }
-               if (fdt_string_eq_(fdt, fdt32_ld(&prop->nameoff),
+               if (fdt_string_eq_(fdt, fdt32_to_cpu(prop->nameoff),
                                   name, namelen)) {
                        if (poffset)
                                *poffset = offset;
@@ -459,7 +459,7 @@ const void *fdt_getprop_namelen(const void *fdt, int nodeoffset,
 
        /* Handle realignment */
        if (fdt_chk_version() && fdt_version(fdt) < 0x10 &&
-           (poffset + sizeof(*prop)) % 8 && fdt32_ld(&prop->len) >= 8)
+           (poffset + sizeof(*prop)) % 8 && fdt32_to_cpu(prop->len) >= 8)
                return prop->data + 4;
        return prop->data;
 }
@@ -477,7 +477,7 @@ const void *fdt_getprop_by_offset(const void *fdt, int offset,
                int namelen;
 
                if (fdt_chk_extra()) {
-                       name = fdt_get_string(fdt, fdt32_ld(&prop->nameoff),
+                       name = fdt_get_string(fdt, fdt32_to_cpu(prop->nameoff),
                                              &namelen);
                        if (!name) {
                                if (lenp)
@@ -486,13 +486,13 @@ const void *fdt_getprop_by_offset(const void *fdt, int offset,
                        }
                        *namep = name;
                } else {
-                       *namep = fdt_string(fdt, fdt32_ld(&prop->nameoff));
+                       *namep = fdt_string(fdt, fdt32_to_cpu(prop->nameoff));
                }
        }
 
        /* Handle realignment */
        if (fdt_chk_version() && fdt_version(fdt) < 0x10 &&
-           (offset + sizeof(*prop)) % 8 && fdt32_ld(&prop->len) >= 8)
+           (offset + sizeof(*prop)) % 8 && fdt32_to_cpu(prop->len) >= 8)
                return prop->data + 4;
        return prop->data;
 }
@@ -517,7 +517,7 @@ uint32_t fdt_get_phandle(const void *fdt, int nodeoffset)
                        return 0;
        }
 
-       return fdt32_ld(php);
+       return fdt32_to_cpu(*php);
 }
 
 const char *fdt_get_alias_namelen(const void *fdt,
index 36fadcdea516a2294212e5aa002f485f03e06d4b..fa63fffe28e96899f3a5fb80fbc4df52990a96a5 100644 (file)
@@ -117,23 +117,6 @@ static inline void *fdt_offset_ptr_w(void *fdt, int offset, int checklen)
 
 uint32_t fdt_next_tag(const void *fdt, int offset, int *nextoffset);
 
-/*
- * Alignment helpers:
- *     These helpers access words from a device tree blob.  They're
- *     built to work even with unaligned pointers on platforms (ike
- *     ARM) that don't like unaligned loads and stores
- */
-
-static inline uint32_t fdt32_ld(const fdt32_t *p)
-{
-       const uint8_t *bp = (const uint8_t *)p;
-
-       return ((uint32_t)bp[0] << 24)
-               | ((uint32_t)bp[1] << 16)
-               | ((uint32_t)bp[2] << 8)
-               | bp[3];
-}
-
 static inline void fdt32_st(void *property, uint32_t value)
 {
        uint8_t *bp = (uint8_t *)property;
@@ -144,20 +127,6 @@ static inline void fdt32_st(void *property, uint32_t value)
        bp[3] = value & 0xff;
 }
 
-static inline uint64_t fdt64_ld(const fdt64_t *p)
-{
-       const uint8_t *bp = (const uint8_t *)p;
-
-       return ((uint64_t)bp[0] << 56)
-               | ((uint64_t)bp[1] << 48)
-               | ((uint64_t)bp[2] << 40)
-               | ((uint64_t)bp[3] << 32)
-               | ((uint64_t)bp[4] << 24)
-               | ((uint64_t)bp[5] << 16)
-               | ((uint64_t)bp[6] << 8)
-               | bp[7];
-}
-
 static inline void fdt64_st(void *property, uint64_t value)
 {
        uint8_t *bp = (uint8_t *)property;
@@ -232,7 +201,7 @@ int fdt_next_subnode(const void *fdt, int offset);
 /* General functions                                                  */
 /**********************************************************************/
 #define fdt_get_header(fdt, field) \
-       (fdt32_ld(&((const struct fdt_header *)(fdt))->field))
+       (fdt32_to_cpu(((const struct fdt_header *)(fdt))->field))
 #define fdt_magic(fdt)                 (fdt_get_header(fdt, magic))
 #define fdt_totalsize(fdt)             (fdt_get_header(fdt, totalsize))
 #define fdt_off_dt_struct(fdt)         (fdt_get_header(fdt, off_dt_struct))