efi_loader: efi_dp_from_file() expect UTF-8 path
[oweals/u-boot.git] / lib / fdtdec.c
index fea44a9a8c65d22cff39fd953328532e5b9b55aa..3ee786b57940df4b12f89cce3003f2c2a252c9e0 100644 (file)
@@ -1261,6 +1261,35 @@ __weak void *board_fdt_blob_setup(void)
 }
 #endif
 
+int fdtdec_set_ethernet_mac_address(void *fdt, const u8 *mac, size_t size)
+{
+       const char *path;
+       int offset, err;
+
+       if (!is_valid_ethaddr(mac))
+               return -EINVAL;
+
+       path = fdt_get_alias(fdt, "ethernet");
+       if (!path)
+               return 0;
+
+       debug("ethernet alias found: %s\n", path);
+
+       offset = fdt_path_offset(fdt, path);
+       if (offset < 0) {
+               debug("ethernet alias points to absent node %s\n", path);
+               return -ENOENT;
+       }
+
+       err = fdt_setprop_inplace(fdt, offset, "local-mac-address", mac, size);
+       if (err < 0)
+               return err;
+
+       debug("MAC address: %pM\n", mac);
+
+       return 0;
+}
+
 static int fdtdec_init_reserved_memory(void *blob)
 {
        int na, ns, node, err;
@@ -1300,6 +1329,7 @@ int fdtdec_add_reserved_memory(void *blob, const char *basename,
        fdt32_t cells[4] = {}, *ptr = cells;
        uint32_t upper, lower, phandle;
        int parent, node, na, ns, err;
+       fdt_size_t size;
        char name[64];
 
        /* create an empty /reserved-memory node if one doesn't exist */
@@ -1340,7 +1370,8 @@ int fdtdec_add_reserved_memory(void *blob, const char *basename,
         * Unpack the start address and generate the name of the new node
         * base on the basename and the unit-address.
         */
-       lower = fdt_addr_unpack(carveout->start, &upper);
+       upper = upper_32_bits(carveout->start);
+       lower = lower_32_bits(carveout->start);
 
        if (na > 1 && upper > 0)
                snprintf(name, sizeof(name), "%s@%x,%x", basename, upper,
@@ -1374,7 +1405,9 @@ int fdtdec_add_reserved_memory(void *blob, const char *basename,
        *ptr++ = cpu_to_fdt32(lower);
 
        /* store one or two size cells */
-       lower = fdt_size_unpack(carveout->end - carveout->start + 1, &upper);
+       size = carveout->end - carveout->start + 1;
+       upper = upper_32_bits(size);
+       lower = lower_32_bits(size);
 
        if (ns > 1)
                *ptr++ = cpu_to_fdt32(upper);